2013-05-11 71 views
1

我似乎有一個在我的c#應用程序& C++應用程序之間創建管道的問題。 我的c + +應用程序是一個DLL注入到某個程序,並打開 管道到我的C#應用​​程序。C++ Pipes/ReadFile lpNumberOfBytesRead/DLL

我的問題?在ReadFile的lpNumberOfBytesRead(cbRead)總是返回0

代碼:

hPipe1=CreateFile(lpszPipename1, GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); 
hPipe2=CreateFile(lpszPipename2, GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); 

BOOL fSuccess; 
char chBuf[100]; 
DWORD dwBytesToWrite = (DWORD)strlen(chBuf); 
DWORD cbRead; 
int i; 


while(1){ 
fSuccess = ReadFile(hPipe2,chBuf,dwBytesToWrite,&cbRead, NULL); 
if(fSuccess) 
{ 
    //4Stackoverflow: This works 
    msg = ""; 
    for(i=0;i<cbRead;i++){ 
     //4Stackoverflow: This never gets called, because cbRead is always 0 
     MessageBoxW(NULL, L"Sent", L"Hooked MBW", MB_ICONEXCLAMATION); 
     msg += chBuf[i]; 
    } 
+0

而'dwBytesToWrite'是非零? – 2013-05-11 17:14:33

+0

嗯,我從來沒有使用C++,但在這種情況下,我必須使用它。是不是dwBytesToWrite總是100因爲strlen(...?或者當我調用ReadFile時,它是否改變爲chBuf的長度?hmm沒有檢查這個。可能是問題,只有爲什麼chBuf是空的,會發布c#代碼 – 2013-05-11 17:18:23

+0

上msdn dwBytesToWrite:_In_ DWORD nNumberOfBytesToRead, 所以它應該總是100正確?也許我應該硬編碼,以防萬一,而不是使用strlen – 2013-05-11 17:20:38

回答

1

strlen函數實際上計算任何指針傳遞給它的每一個字節,直到它找到一個字節等於零。如果chBuf的第一個字節中有一個零,那麼strlen將返回零。

由於您似乎沒有初始化或讀入chBuf,因此內容將是隨機的。

你想用什麼sizeof操作:

DWORD dwBytesToWrite = (DWORD)sizeof(chBuf); 

陣列上使用時,sizeof操作,返回該尺寸在該數組的字節。但是,在任何其他指針上使用它時要小心,或者將數組作爲參數傳遞給函數,因爲它將是實際指針的大小,而不是它指向的內容。