我不想问这个,因为我认为这一定很琐碎。但作为一个习惯于高级语言的人,这是一个真正的问题。
我有一个 C++ 程序,它使用 PDFium 生成 PDF 的图像。我有一个 C# 程序,它通过命名管道与 C++ 程序通信。PDF 文件(保存为字节数组)由管道传输。这是我的问题。
在流的第 374 个位置是一个 NUL 字节(00),我太愚蠢了,无法以某种方式到达它之后的数据。
这是我的代码:
LPTSTR lpszPipename2 = TEXT("\\\\.\\pipe\\myNamedPipe2");
hPipe2=CreateFile(lpszPipename2, GENERIC_READ, 0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(ReadFile( hPipe2, chBuf, dwBytesToRead, &cbRead, NULL))
{
PDFData = chBuf;
}
要读取的 dwBytes 是文件的大小,而 cbRead 显示正确的数字。但 PDFData 只包含前 373 个字节。我用即时窗口检查了第 373 位以外的数据,我只是不知道如何处理它。我必须将数据放入一个字符数组中。
正如我已经说过的,我认为这是非常微不足道的。但是,虽然我知道问题出在哪里,但我根本不知道如何解决它。
非常感谢和问候
迈克尔
编辑:C#代码。它的一切,但完美。但我很确定这个问题出在 C++ 方面。
public void SendRawData(byte[] data)
{
while (clientse == null || clientse.stream == null)
{ }
if (clientse.stream.CanWrite)
{
clientse.stream.Write(data, 0, data.Length);
clientse.stream.Flush();
}
}
private void ListenForClients()
{
while (true)
{
clientHandle = CreateNamedPipe(this.pipeName, DUPLEX | FILE_FLAG_OVERLAPPED, 0, 255, BUFFER_SIZE, BUFFER_SIZE, 0, IntPtr.Zero);
//could not create named pipe
if (clientHandle.IsInvalid)
return;
int success = ConnectNamedPipe(clientHandle, IntPtr.Zero);
//could not connect client
if (success == 0)
return;
clientse = new Client();
clientse.handle = clientHandle;
clientse.stream = new FileStream(clientse.handle, FileAccess.ReadWrite, BUFFER_SIZE, true);
if (ClientType == 0)
{
Thread readThread = new Thread(new ThreadStart(Read));
readThread.Start();
}
}
}
“解决方案”: 实际上这从来都不是一个真正的问题。我刚刚把我的电线交叉了。虽然 chBuf 似乎在将其复制到 PDFData 之后或者当我读取它的值是 VS 时只有那些 373 个字节。所有约 20 KB 都被复制到该位置。我知道,但我不明白 PDFium 源应该如何知道字符串是否在 373 个字符后终止。
嗯... PDFium-sources 知道它,因为我必须通过长度。这是由
size_t len = PDFData.length();
因此当然只有 373 个字节。