2013-05-11 4 views
1

내 C# 응용 프로그램 & C++ 응용 프로그램 사이에 파이프를 만드는 데 문제가있는 것 같습니다. 내 C++ 응용 프로그램은 특정 프로그램에 주입되는 dll이며, 내 C# 응용 프로그램의 파이프를 엽니 다.C++ 파이프/ReadFile lpNumberOfBytesRead/DLL

내 문제는 무엇입니까? ReadFile을 lpNumberOfBytesRead (cbRead) 항상 0

코드 반환이 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'가 0이 아닌가요? –

+0

흠, 나는 C++을 사용하지 않지만이 경우에는 사용해야합니다. strlen 때문에 dwBytesToWrite가 항상 100이 아닙니다 (...? 아니면 ReadFile을 호출 할 때 chBuf의 길이로 변경됩니까? hmm이 확인하지 않았습니다.) 문제가 될 수 있으며, 단지 chBuf가 비어있을 것입니다. C#을 게시 할 것입니다. 코드 –

+0

에 msdn dwBytesToWrite : _In_ DWORD nNumberOfBytesToRead, 그래서 항상 100이어야합니다? 어쩌면 나는 strlen을 사용하는 대신에 하드 코딩해야합니다. –

답변

1

strlen 기능은 실제로 당신이 그것을 통과 어떤 포인터의 모든 바이트를 계산합니다. chBuf의 첫 번째 바이트에 0이 있으면 strlen은 0을 반환합니다.

chBuf으로 초기화하거나 읽지 않는 것처럼 내용이 임의로 표시됩니다.

DWORD dwBytesToWrite = (DWORD)sizeof(chBuf); 

배열에 사용되는 sizeof 연산자는, 그 배열의 크기를 바이트 단위로 반환 사용할 것 무엇

sizeof 연산자입니다. 그러나 다른 포인터 나 배열에서 함수를 인수로 전달할 때는 포인터가 가리키는 포인터가 아닌 실제 포인터의 크기가되므로주의해야합니다.