これは非常に些細なことだと思うので、これを尋ねるのは嫌いです。しかし、高級言語に慣れている人にとって、これは本当の問題です。
PDFiumを使用して画像をPDFに生成するC++プログラムを入手しました。名前付きパイプを介して 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 キロバイトすべてがその位置にコピーされました。私はそれを知っていましたが、文字列が 373 文字の後に終了するかどうかを PDFium ソースがどのように認識すべきかを理解していませんでした。
ええと... PDFiumソースは、長さを渡す必要があることを知っています。によって決定されたもの
size_t len = PDFData.length();
したがって、もちろんわずか 373 バイトでした。