簡體   English   中英

WinAPI EM_STREAMOUT崩潰

[英]WinAPI EM_STREAMOUT crash

我正在嘗試從另一個程序獲取Richedit控件的文本。

因此,我為SendMessage找到了EM_STREAMOUT。

到目前為止,這是我的代碼(也來自另一個Stackoverflow主題):

    DWORD CALLBACK EditStreamOutCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    std::stringstream *rtf = (std::stringstream*) dwCookie;
    rtf->write((char*)pbBuff, cb);
    *pcb = cb;
    return 0;
}

int main() {
    std::stringstream rtf;

    EDITSTREAM es = {0};
    es.dwCookie = (DWORD_PTR) &rtf;
    es.pfnCallback = &EditStreamOutCallback;
    SendMessage((HWND) 0x00000000000A06E8, EM_STREAMOUT, SF_RTF, (LPARAM)&es);

}

唯一發生的是,SendMessage返回0-因此顯然沒有讀取任何字節-並且我嘗試從中獲取信息的程序的CPU使用率高達100%。

Windows為您封送了一些消息,例如WM_GETTEXT 這就是為什么您可以跨過程邊界檢索窗口的文本。 EM_STREAMIN/OUT未自動封送。 這就是為什么您的代碼崩潰的原因。 EDITSTREAM結構和回調代碼必須存在於擁有RichEdit的同一進程的地址空間中。

對於許多需要跨越進程邊界的非編組消息,可以使用VirtualAllocEx()分配輸入/輸出緩沖區,使用WriteProcessMemory()填充它們,並使用ReadProcessMemory()從中讀取。 但是,由於EDITSTREAM回調代碼也需要處於同一進程中,因此最好將整個EM_STREAMOUT邏輯移到DLL中,然后使用CreateRemoteThread()或其他注入技術將其注入到目標進程中。 您可以使用GetWindowThreadProcessId()獲取擁有RichEdit的進程/線程ID。 然后,您的DLL可以檢索RichEdit數據,並使用您選擇的任何IPC(進程間通信)機制將其發送回您的主應用程序,例如命名管道,郵筒, WM_COPYDATA消息等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM