C ++ Pipes / ReadFile lpNumberOfBytesRead / DLL

Кажется, у меня проблема с созданием канала между моим приложением c # & Приложение C ++.
мое приложение на c ++ — это dll, которая вставляется в определенную программу и открывает
труба к моему приложению c #.

Моя проблема? в 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];
}

1

Решение

strlen Функция фактически считает каждый байт в любом указателе, который вы передаете, пока не найдет байт, равный нулю. Если в первом байте есть ноль chBuf затем strlen вернет ноль.

Как вы, кажется, не инициализировать или читать в chBuf содержание будет случайным.

То, что вы хотите использовать, это sizeof оператор:

DWORD dwBytesToWrite = (DWORD)sizeof(chBuf);

sizeof оператор при использовании в массиве, возвращает размер в байтах этого массива. Однако будьте осторожны при использовании его с любым другим указателем или массивом, переданным в качестве аргумента функции, так как тогда это будет размер фактического указателя, а не то, на что он указывает.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]