c++ dll에서 char* 로 받은 변수를 TMemorystream에 write하고 싶은데...
중간에 널문자( )가 있어서 잘려서 write됩니다.
전 이 널문자까지 그대로 스트림에서 넣어서 그 스트림으로 부터 이미지를 불러오구 싶군요..
그런데 널문자 때문에 처리가 안돼는군요..
답변 좀 부탁드립니다...
c++ dll
_declspec(dllexport) char *MyTest1() {
// 실제로는 bmp 이미를 버퍼에 담아서 그대로 char* 로 넘겨주려고 합니다.
CBaseImage* m_pImage;
/*
m_pImage = new CBaseImage;
m_pImage->LoadBmp("F:\Help Program\Tcp전송테스트\VdoServer\video\FRM.BMP");
m_pImage->SaveToBuf1();
return m_pImage->GetStream();
*/
// 테스트
char* temp = NULL;
temp = new char [100];
memcpy(temp, "012356789012356789012356789012356789012356789012356789012356789012356789012356789012356789",100);
temp[20] = 0x00;
return temp;
}
delphi 모듈
procedure TForm1.Button4Click(Sender: TObject);
var
temp: pChar;
bt: byte;
len: integer;
mem: TMemoryStream;
bmp: TBitmap;
begin
temp := MyTest1();
// 문제 1: 100만큼 출력하고 싶은데 이 있는 문자까지만 출력됩니다...
showMessage(string(temp));
try
mem := TMemoryStream.Create;
mem.Position := 0 ;
// 문제 2: 그대로 메모리스트림에 써야 하는데 이상하게 써 집니다..
// 메모리스트림에 그대로 0123456789012345...이렇게 써지길 원하는데 이상하게 써집니다..
// 만약 bmp라면 BMf~~~~~~~~~~~~~~이렇게 써 져야 하는데 엉뚱하게 써 집니다...
mem.Write(temp, 100);
mem.SaveToFile('F:EnwiserHelp ProgramTcp전송테스트VdoServervideocopy1.bmp');
finally
mem.Free;
end;
end;
몇 가지 문제가 있어 보여서, 잘 모르지만 잡답 비슷하게 써볼랍니다.
음... DLL에서 해당 버퍼의 포인터를 넘겨 주었는데, 중간에 널 문자가 포함되면, 당근 거기까지만 처리하겠지요. 이는 PChar 자체가 C의 char * 비슷하게 동작하기 때문에, 널문자 전까지만, 문자열로 취급하기 때문이겠죠.
대부분의 API를 보시면 알겠지만, 버퍼 자체(널 문자를 포함한)를 전송하려고 할 때는 반드시 버퍼의 크기도 함께 보내주게 되어 있습니다. 이는 중간에 널 문자나, 파일 종료 문자를 만나서 버퍼의 데이터를 중간에 자르지 말고, 해당 버퍼 크기 만큼 처리하기 위해서이겠죠...
그러니까, 아래와 같은 경우, 버퍼의 포인터와 함께, 해당 버퍼의 크기를 함께 넘겨 주시고, 델파이 쪽에서 버퍼의 포인터와 해당 버퍼의 크기를 받아서 버퍼의 크기만큼 메모리 스트림에 써 주면, 널 문자에 관계없이 잘 처리되리라 생각 됩니다.
그럼, 즐푸~