我有一個Delphi應用程序,它通過電話發送文本塊的命名管道通過命名管道發送文本崩潰Delphi應用程序
SendMessageToNamedPipe(hPipe, CurMsg);
它工作正常的一些消息,但發送其它文本導致應用程序崩潰。
我意識到正常消息和「崩潰」消息之間的唯一區別是崩潰消息包含大量西里爾文字符。
我應該如何編碼它們才能使上述呼叫正確執行?
更新1:這裏是SendMessageToNamedPipe
的實現。
procedure SendMessageToNamedPipe(hPipe:THandle; msg:string);
const
OUT_BUF_SIZE = 100;
var
dwWrite : DWORD;
lpNumberOfBytesWritten : LongBool;
utf8String : RawByteString;
sendBuf: array[0..OUT_BUF_SIZE] of WideChar;
begin
utf8String := UTF8Encode(msg);
sendBuf[0] := #0;
lstrcatw(sendBuf, PChar(msg));
lpNumberOfBytesWritten := WriteFile(hPipe, sendBuf, OUT_BUF_SIZE, dwWrite, NIL);
if not lpNumberOfBytesWritten then
begin
OutputDebugString(PChar('Sending error: ' + SysErrorMessage(GetLastError)));
end
else
begin
OutputDebugString(PChar('Message sent, dwWrite: ' + IntToStr(dwWrite)));
end;
end;
更新2:功能,這似乎工作的版本。
procedure SendMessageToNamedPipe(hPipe:THandle; msg:string);
const
OUT_BUF_SIZE = 200;
var
dwWrite : DWORD;
Success : LongBool;
msgToSend : PChar;
utf8String : RawByteString;
sendBuf: array[0..OUT_BUF_SIZE-1] of WideChar;
AnsiCharString : PAnsiChar;
begin
OutputDebugString(PChar('SendMessageToNamedPipe.Length(msg): ' + IntToStr(Length(msg))));
OutputDebugString(PChar('Sending message: ' + msg));
utf8String := UTF8Encode(msg);
sendBuf[0] := #0;
lstrcatw(sendBuf, PChar(msg));
Success := WriteFile(hPipe, sendBuf, Length(sendbuf), dwWrite, NIL);
if not Success then
begin
OutputDebugString(PChar('Sending error: ' + SysErrorMessage(GetLastError)));
end
else
begin
OutputDebugString(PChar('Message sent, dwWrite: ' + IntToStr(dwWrite)));
end;
end;
爲什麼你UTF-8編碼,然後堅持在UTF-16緩衝區?爲什麼你甚至不打擾緩衝區。只需發送PAnsiChar(utf8string) –
我試過'AnsiString:= PAnsiChar(utf8String); lpNumberOfBytesWritten:= WriteFile(hPipe,AnsiString,Length(AnsiString),dwWrite,NIL);'得到相同的結果。 –
成功:= WriteFile(hPipe,PAnsiChar(utf8string),Length(utf8string)+1,dwBytesWritten,nil); –