ADB管道通信

打開剪貼板:
OpenClipboard
返回值為BOOL,成功返回非0,若失敗或剪貼板被佔用,返回0.
CloseClipboard:關閉
EmptyClipboard:清空
前一個程序調用關閉,後一個程序調用清空后,打開剪貼板的當前窗口才擁有剪貼板。
SetClipboardData向剪貼板中防止數據。
參數:
nFormat:剪貼板格式
hMem:具有指定格式的數據的句柄
-------------------------------------------------------------------
延遲提交技術
-------------
第一次調用SetClipboardData時,將其hMem參數設置為NULL,在剪貼板上以指定的剪貼板格式放置一個
空的剪貼板數據塊。然後直到其他進程需要數據或自身進程需要終止運行時再次調用SetClipboardData函數,這次
才真正提交數據(不需再調用OpenClipboard和EmptyClipboard)
IsClipboardFormatAvailable(format)//檢測剪貼板上是否包含了參數format指定的格式的數據
GetClipboardData(CF_TEXT);//從剪貼板上獲得指定數據
----------------------------------------------------------------------------
匿名管道
----------
匿名管道時未命名的單向管道,通常用來在一個父進程和一個子進程之間傳輸數據。
匿名管道只能實現本地機器上兩個進程之間的通信,而不能實現跨網路的通信。
CreatePipe(



返回值是蓋匿名管道的讀寫句柄。
當調用CreateProcess創建一個子進程時,他將繼承父進程所有打開的句柄。將子進程的特殊句柄設置為管道的
讀寫句柄,將子進程的標準輸入輸出句柄分別設定為管道的讀寫句柄。
GetStdHandle獲取標準輸入、輸出、標準錯誤輸出句柄。
在創建一個新進程時,系統會為該進程建立一個 進程內核對象和一個線程內核對象。每個對象都有使用計數
初始值為1,當CreateProcess函數在其內部打開這些對象時,計數變量變為2,執行CloseHandle,減一,系統終止運行減一。
當計數變為零時,內存釋放,
因為匿名管道沒有名稱,所以只能在父進程中調用CreateProcess函數創建線程時,將管道的讀、寫句柄傳遞給子進程。

進程優先級:
實時(REALTIME) > 高(HIGH) > 高於正常(ABOVE_NORMAL) > 正常(NORMAL) > 低於正常(BELOW_NORMAL) > 空閒(IDEL)
---------------------------------------------------------------------------------------------------
命名管道
---------
不僅可以在本機上實現兩個進程間的通信,還可以跨網絡實現兩個進程間的通信。
命名管道的兩種通信模式:字節模式和消息模式。

對於一個命名管道來說,在某個時刻,它只能與一個客戶端進行通信。

調用CreateNamedPipe函數創建一個命名管道的實例,并返回該命名管道的句柄。
一個命名管道的服務器進程使用該函數創建命名管道的第一個實例,并建立其基本屬性,或創建一個命名管道的新實例。
如需創建 一個命名管道的多個實例,需多次調用CreateNamedPipe函數。

-------------------------------------------------------------------------------
郵槽
424字節以下
-----
郵槽是基于廣播通信体系設計的,采用無連接的不可靠的數據傳輸。郵槽是一种單向的通信机制,創建郵槽的服務器進程讀取數据,打開郵槽的客戶机進程寫入數据。
----------------------------------------------------------------------------------------------------------------------------------------------------


服務器端:
創建管道>>監聽>>讀寫>>關閉

CreateNamedPipe
 
ConnectNamedPipe
 
ReadFile/WriteFile
 
DisconnectNamedPipe

客戶端:
打開命名管道,獲得句柄>>寫入數據>>等待回復
WaitNamedPipe 

SetNamedPipeHandleState

---------------------------------------------------------------------------------------------
I/O模式:
在具有數據流形式的輸入輸出:進程通信、文件輸入輸出,內核通信,網絡通信
異步I/O:Asynchronous
在調用ReadFile/WriteFile等函數后,函數立即返回,線程可以進行其他操作。剩下的I/O操作在系統內核中自動完成。
在系統內核完成輸入輸出後,程序通過以下方式獲得結果:
1.完成函數:Routines
在內核完成I/O后,內核回調該函數,當該函數被調用,及說明內核已經完成I/O,在該函數內可進行I/O完成後所需要的操作。
同步I/O:Synchronous
在調用I/O函數時,系統完成了I/O操作才返回。在操作系統進行I/O操作的過程中,用戶態縣城不能執行。
在同步I/O時,若需要在I/O時進行其他操作當再開啟線程。

-------------------------------------------------------------------------------------------------
PeekNamedPipe函數
 
從命名管道/匿名管道中拷貝數據到一個指定緩衝區,原管道中的數據仍保留;
 
原型 
BOOL WINAPI PeekNamedPipe(
    __in       HANDLE hNamedPipe,    //命名匿名管道句柄
    __out_opt  LPVOID lpBuffer,        //接受從管道中讀取的數據,可以為空;
    __in       DWORD nBufferSize,    //指定lpBuffer的大小;
    __out_opt  LPDWORD lpBytesRead,    //實際接收數據的大小;
    __out_opt  LPDWORD lpTotalBytesAvail,        //管道中所有可讀數據的大小;
    __out_opt  LPDWORD lpBytesLeftThisMessage    //當前消息中剩餘的字節數;
    );
----------------------------------------------------------------------------------------------------

\r、\n、回車

回車換行(\n\r):每次光標移到下一行的行首位置處;
 
?行(\r):每次光標移到本行的行首位置處。

\n:每次光標移到下一行的本位置處
在liniux中打開win文檔,每行尾有“^M”^——Ctrl,M——換行
------------------------------------------------------------------   
代碼:
--------
程序組:

1.剪貼板:Clipboard
2.匿名管道:Child & Parent
3.命名管道:NamedPipeClt & NamedPipeSrv
4.郵槽:MailslotSrv & MailslotClt


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在进行vc(Visual C++)对adb(Android Debug Bridge)的管道操作时,我们可以使用ShellExecute函数来执行adb命令,并且通过popen函数将adb命令的输出结果读取到程序中。 首先,在vc中包含Windows.h头文件来使用系统函数。然后可以通过创建一个子进程来执行adb命令,例如使用ShellExecute函数来执行adb shell命令,如下所示: ```c++ #include <Windows.h> #include <iostream> int main() { // 创建子进程执行adb命令 ShellExecute(NULL, "open", "adb", "shell", NULL, SW_HIDE); return 0; } ``` 另外,如果需要读取adb命令的输出结果,可以使用popen函数,如下所示: ```c++ #include <Windows.h> #include <iostream> int main() { // 创建子进程执行adb命令 FILE* pipe = _popen("adb devices", "r"); if (pipe != NULL) { // 读取adb命令输出结果 char buffer[128]; while (!feof(pipe)) { if (fgets(buffer, 128, pipe) != NULL) { std::cout << buffer; } } _pclose(pipe); } return 0; } ``` 在以上示例中,我们使用_popen函数来执行adb devices命令,并通过循环读取pipe来获取adb命令的输出结果,并通过std::cout输出到控制台。 这样,通过以上的方法,我们可以在vc中对adb进行管道操作,实现与adb的交互和数据传输。 ### 回答2: 在使用VC(Visual C++)来对adb(Android Debug Bridge)进行管道操作,可以通过以下步骤: 1. 首先,通过启动adb命令来建立与Android设备的连接。可以使用CreateProcess函数创建一个带有adb路径和参数的进程。 2. 调用CreatePipe函数创建一个管道,以便在进程间进行通信。这个函数会返回两个文件句柄,一个用于读取,一个用于写入。 3. 然后,用GetStdHandle函数获取当前进程标准输出句柄(stdout),并将其重定向到管道的写入端。这样,通过写入管道,就可以将输出从adb命令传递给应用程序。 4. 使用ReadFile函数从管道的读取读取adb命令的输出结果。这样,就可以获取adb命令的输出,并在应用程序中进行处理。 5. 当不再需要与adb进行通信时,使用CloseHandle函数关闭管道的读取和写入句柄。 通过以上步骤,就可以实现使用VC来对adb进行管道操作。在操作过程中,需要注意路径和参数的正确设置,以确保adb命令能够正确执行,并且及时关闭管道句柄以避免资源泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值