亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dos程序如何讀寫windows剪貼板.txt

?? DOS程序如何讀寫Windows剪貼板才解決文件共享沖突問題
?? TXT
字號:
DOS程序如何讀寫Windows剪貼板
李海
本文發(fā)表在98年7月1日《計算機世界》7期
 

    現(xiàn)在再也沒有人會懷疑Windows將取代DOS了,但由于種種原因,特別是在擁有大量正在運行的DOS程序的情況下,軟件開發(fā)還只能逐步從DOS向Windows過渡,如何使DOS程序與Windows程序進行數(shù)據(jù)交換就成了一個重要的問題。在介紹我們的解決方案之前,先簡單回顧一下經(jīng)典的方法[1]。一般是由處于實模式的DOS程序先申請一塊常規(guī)內(nèi)存,然后由Windows程序利用Windows 3.x API中的三個函數(shù):AllocSelector()、SetSelectorBase()和SetSelectorLimit(),在保護模式下讀寫這塊內(nèi)存,從而實現(xiàn)Windows和DOS程序的數(shù)據(jù)交換。這種方法在實時數(shù)據(jù)采集方面有很好的效果,但它也有兩個比較大的缺點:一個是Windows程序設計比較麻煩,特別是初學者容易導致GPF錯誤,而且難于用Visual Basic和FoxPro實現(xiàn);另一個是在Win32 API中取消了這三個函數(shù),使得Windows 95程序不能再采用這一方法。我們的方法是讓DOS程序直接讀寫Windows的剪貼板,這樣可以象其他Windows程序一樣利用剪貼板交換數(shù)據(jù)。這種方法可以在一些經(jīng)典方法不能使用的場合獲得較好的效果。

    我們知道,DOS程序調(diào)用系統(tǒng)功能都是通過中斷實現(xiàn),而Windows程序則是通過一組API來實現(xiàn)的,但這并不等于說Windows就不使用中斷了。在Windows中不光是文件操作使用了DOS中斷,它自身特有的許多功能也是通過中斷實現(xiàn),這其中就包括了我們所要用到的剪貼板函數(shù)。不單單是Windows 3.x使用了內(nèi)部中斷,Windows 95也使用了大量的內(nèi)部中斷。Windows的內(nèi)部中斷主要是利用了INT 2FH,所有在Windows下運行的程序(包括MS-DOS應用程序)都可以調(diào)用這些中斷。所以DOS程序可以象Windows程序一樣完全合法地調(diào)用這些Windows功能,只不過這種方法是秘密的,在Windows SDK手冊上沒有介紹。剪貼板函數(shù)使用的都是INT 2FH的17號功能,即AH=17H。比如在Windows程序讀寫剪貼板之前都要調(diào)用OpenClipboard()函數(shù),這個函數(shù)對應著17號功能的1號子功能,可以用下面這段代碼來實現(xiàn):

MOV AX, 1701H
INT 2FH

    類似地,我們可以實現(xiàn)Windows API中的EmptyClipboard()、CloseClipboard() 、SetClipboardData()和GetClipboardData()函數(shù)。除此以外,我們還發(fā)現(xiàn)了一個在SDK手冊上沒有的GetClipboardDataSize()函數(shù),這個函數(shù)返回剪貼板的數(shù)據(jù)大小,這個數(shù)值通常是16的整數(shù)倍,它比剪貼板上實際字符串的長度要大,這個函數(shù)對你在讀剪貼板之前進行內(nèi)存分配很有幫助。下面這段示例程序包括了這些函數(shù)的實現(xiàn)。在調(diào)用這些中斷之前先要確保Windows已經(jīng)運行,示例中的IsWindowsRunning()函數(shù)就是完成這一工作的。你甚至可以用老掉牙的編譯系統(tǒng)Turbo C 2.0來運行它。示例程序先在剪貼板上寫入一個字符串,然后從剪貼板讀回這個字符串。你可以發(fā)現(xiàn)整個示例程序的編程同Windows程序的差別是很小的,這是此種方法的一個優(yōu)點:你對DOS程序的修改可以減少到最少,而Windows程序則不需要任何修改。可以預見,如果你把DOS部分移植到Windows上來,此處所需的改動也是很少的。

#include <stdlib.h>
#include <dos.h>
#include <string.h>

union REGS r;
struct SREGS sr;

/*
The OpenClipboard function opens the clipboard. Other applications
will not be able to modify the clipboard until the CloseClipboard
function is called.
*/
void OpenClipboard()
{
r.x.ax = 0x1701;
int86(0x2f, &r, &r);
}

/*
The EmptyClipboard function empties the clipboard and frees handles
to data in the clipboard.
*/
void EmptyClipboard()
{
r.x.ax = 0x1702;
int86(0x2f, &r, &r);
}

/*
The CloseClipboard function closes the clipboard.
*/
void CloseClipboard()
{
r.x.ax = 0x1708;
int86(0x2f, &r, &r);
}

/*
The SetClipboardData function sets the data in the clipboard. The
application must have called the OpenClipboard function before
calling the SetClipboardData function.
*/
int SetClipboardData(char* s)
{
int Len;

Len = strlen(s) + 1;
r.x.ax = 0x1703;
r.x.dx = 1;
r.x.si = 0;
r.x.cx = Len;
r.x.bx = FP_OFF(s);
sr.es = FP_SEG(s);
int86x(0x2f, &r, &r, &sr);
return r.x.ax;
}

/*
The GetClipboardDataSize function retrieves the size of the current
clipboard data. This function is undocumented in Windows SDK.
*/
int GetClipboardDataSize()
{
r.x.ax = 0x1704;
r.x.dx = 1;
int86(0x2f, &r, &r);
return r.x.ax;
}

/*
The GetClipboardData function retrieves a handle of the current
clipboard data having string format. The clipboard must have been
opened previously.
*/
int GetClipboardData(char* s)
{

r.x.ax = 0x1705;
r.x.dx = 1;
r.x.bx = FP_OFF(s);
sr.es = FP_SEG(s);
int86x(0x2f, &r, &r, &sr);
return r.x.ax;
}

/*
The IsWindowsRunning function detects whether Windows is running.
The application must have called this function before calling all
Clipboard functions.
*/
int IsWindowsRunning()
{
r.x.ax = 0x1700;
int86(0x2f, &r, &r);
return r.x.ax != 0x1700;
}

void main()
{
char s[256],s2[]="This string is passed by an MS-DOS application.";

if (!IsWindowsRunning()) {
printf("Windows is NOT running!\n");
exit(- 1);
}

OpenClipboard();
SetClipboardData(s2);
printf("Data size=%d, string length=%d\n", GetClipboardDataSize(s2),
        strlen(s2));
GetClipboardData(s);
printf("%s\n", s);
CloseClipboard();
getch();
}
    我們不需要再編寫一個Windows的示例程序,因為你可以在任何一個能夠進行文本粘貼的Windows 3.x或Windows 95的程序中,比如NotePad,來檢驗這一結(jié)果。從Windows使用者的角度來看,你甚至感覺不到這個字符串是來自DOS的。如果打開Windows的剪貼板查看程序,你會發(fā)現(xiàn)此時剪貼板上的數(shù)據(jù)格式為“文本”和“OEM文本”兩種。

    由于Windows利用剪貼板交換圖形數(shù)據(jù)使用的是位圖句柄,而這不易于DOS應用程序操作,所以利用本方法交換圖形時最好不使用Windows定義的位圖格式。本方法也不是萬能的,它對于時序要求嚴格的或數(shù)據(jù)更新很快的場合不太適用。另外,我們還沒有找到如何截取Windows的DDE消息的辦法,所以目前這種方法不能實現(xiàn)DOS程序和Windows程序間的DDE連接。我們的工作權(quán)且算作拋磚引玉,希望你能找到更好的方法。

參考文獻
[1]紀秀華,一種實現(xiàn)Windows與DOS應用程序間數(shù)據(jù)交換的簡單方法,計算機世界報,1996年4月15日第195版。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av在线不卡电影| 99久久er热在这里只有精品15| 精品久久久久久久久久久久久久久久久 | 亚洲女人小视频在线观看| 欧美va在线播放| 亚洲视频免费观看| 亚洲欧美激情在线| 国产在线国偷精品免费看| 日本不卡一区二区三区 | 日本一区二区高清| 久久久蜜桃精品| 久久一区二区三区四区| 中文字幕不卡一区| 美女视频网站久久| 国产成人午夜片在线观看高清观看| 国产乱码一区二区三区| 大尺度一区二区| 色综合久久久久综合| 欧美性受xxxx黑人xyx| 欧美精品久久99| 欧美大胆人体bbbb| 亚洲欧洲精品天堂一级| 亚洲国产aⅴ天堂久久| 成人免费毛片高清视频| 欧美日韩一区二区在线视频| 欧美不卡一区二区| 日韩av一区二区三区四区| 在线免费精品视频| 久久只精品国产| 久久99久久精品欧美| 韩国女主播一区二区三区| 一本色道久久综合亚洲91| 国产精品免费网站在线观看| 视频一区国产视频| 国产激情一区二区三区| 久久久久久麻豆| 国产一本一道久久香蕉| 久久网这里都是精品| 国内不卡的二区三区中文字幕| 日韩一区二区高清| 综合色天天鬼久久鬼色| 99久久99久久精品国产片果冻| 中文字幕中文字幕一区二区| 日本欧美肥老太交大片| 欧美一区二区三区公司| 一区二区三区四区高清精品免费观看 | 日韩高清一区在线| 日韩一区二区三区高清免费看看| 免费在线观看精品| 久久夜色精品一区| 99综合电影在线视频| 亚洲欧美另类综合偷拍| 欧美日韩高清一区| 亚洲视频一区在线| 欧美日韩一区二区在线观看| 日本中文字幕一区| 久久先锋影音av| 成人高清伦理免费影院在线观看| 欧美大胆人体bbbb| 成人一区在线观看| 亚洲电影在线播放| 成人夜色视频网站在线观看| 中文字幕亚洲欧美在线不卡| 欧美在线视频你懂得| 精品一区二区在线免费观看| 国产精品国产三级国产aⅴ无密码| 欧美日韩一区三区四区| 激情五月播播久久久精品| 国产精品久久午夜| 777亚洲妇女| 亚洲午夜免费福利视频| 日韩午夜激情免费电影| www.一区二区| 奇米精品一区二区三区在线观看| 国产精品久久看| 91麻豆精品国产91久久久久久久久| 国产精品66部| 午夜精彩视频在线观看不卡| 欧美日韩精品一区二区天天拍小说 | 久久99精品久久久| 亚洲色大成网站www久久九九| 欧美肥妇bbw| 91小视频在线免费看| 日韩美女视频19| 精品国产制服丝袜高跟| 国产精品一区二区三区99| 一级日本不卡的影视| 久久精品夜色噜噜亚洲aⅴ| 国产成a人无v码亚洲福利| 国产精品网站在线观看| 欧美一区二区视频在线观看| 色综合久久99| 国产成人精品午夜视频免费| 奇米综合一区二区三区精品视频| 亚洲裸体在线观看| 欧美午夜精品免费| www.日韩在线| 国产精品一二二区| 久久99精品国产麻豆婷婷洗澡| 亚洲成人精品一区| 一区二区三区丝袜| 成人欧美一区二区三区白人 | 久久国产精品免费| 丝袜诱惑制服诱惑色一区在线观看| 亚洲婷婷综合久久一本伊一区| 久久久久久久网| 精品国产凹凸成av人网站| 免费国产亚洲视频| 欧美大片在线观看一区| 99久久99久久综合| aaa亚洲精品一二三区| 国产精品白丝jk白祙喷水网站| 欧美aaa在线| 日本免费新一区视频| 秋霞午夜鲁丝一区二区老狼| 午夜伦欧美伦电影理论片| 亚洲午夜精品网| 亚洲午夜成aⅴ人片| 亚洲在线中文字幕| 欧美色大人视频| 欧美亚洲自拍偷拍| 欧美三级欧美一级| 欧美日韩亚洲不卡| 91精品中文字幕一区二区三区| 精品视频在线免费观看| 欧美精品aⅴ在线视频| 91影视在线播放| a4yy欧美一区二区三区| 99r精品视频| 在线精品视频小说1| 欧美探花视频资源| 91精品国产综合久久精品| 欧美r级在线观看| 久久先锋影音av| 亚洲天天做日日做天天谢日日欢 | 在线观看成人免费视频| 在线观看av一区二区| 91.com视频| 国产女同互慰高潮91漫画| 欧美日韩国产综合一区二区三区| 欧美理论电影在线| 久久丝袜美腿综合| 亚洲桃色在线一区| 五月婷婷综合网| 国产精品77777竹菊影视小说| 97精品久久久久中文字幕| 欧美日韩黄视频| 久久久精品免费免费| 一区二区三区在线视频观看58| 丝袜国产日韩另类美女| 国产精品1区2区| 在线欧美日韩国产| www久久精品| 一区二区三区免费看视频| 韩日av一区二区| 在线观看网站黄不卡| 亚洲精品一线二线三线| 一区二区视频在线| 激情图片小说一区| 欧美视频一二三区| 国产欧美久久久精品影院| 日韩综合在线视频| 99久久免费视频.com| 91精品视频网| 亚洲精品少妇30p| 国产精品2024| 欧美一激情一区二区三区| 国产精品久久看| 国产在线视视频有精品| 777午夜精品免费视频| 成人免费一区二区三区在线观看| 六月婷婷色综合| 欧美日韩国产美女| 国产精品青草综合久久久久99| 免费日韩伦理电影| 欧美三级日本三级少妇99| 成人欧美一区二区三区小说| 韩国女主播一区| 日韩亚洲欧美在线观看| 亚洲mv在线观看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美三级乱人伦电影| 中文在线一区二区| 国产一区欧美一区| 欧美sm美女调教| 美女一区二区在线观看| 欧美精品三级在线观看| 亚洲一区二区三区在线| 91久久奴性调教| 日韩视频不卡中文| 午夜欧美大尺度福利影院在线看| 91麻豆免费看片| 亚洲视频在线一区| 不卡的电视剧免费网站有什么| 欧美精品一区二区三区蜜臀 | 精品国产免费人成在线观看| 日韩精品欧美精品| 91精品国产综合久久久蜜臀图片| 亚洲国产wwwccc36天堂| 欧美情侣在线播放|