У меня есть dll, которая принимает указатель на массив байтов из C ++ и пытается переместить эти данные в AnsiString следующим образом
procedure Convert(const PByteArr: Pointer; ArrSize: Cardinal); export; cdecl;
var
Buf: AnsiString;
begin
SetString(Buf, PAnsiChar(PByteArr^), ArrSize);
end;
Если я вызываю этот метод из Delphi
procedure Try;
var
M: TMemoryStream;
Arr: TBytes;
begin
M := TMemoryStream.Create;
try
M.LoadFromFile('myfile.dat');
SetLength(Arr, M.Size);
M.Position := 0;
M.Read(Arr[0], M.Size);
finally
M.Free;
end;
Convert(@Arr, Length(Arr));
end;
это работает нормально, но из c ++, если дает AV на SetString.
Пожалуйста, помогите мне с этим.
От RredCat:
Позвольте мне добавить некоторые пояснения кВопрос Юрия: Прежде всего о языках, которые мы используем.Нам нужно вызвать Delphi dll в проекте C #.Я создал слой C ++ \ CLI (прокси) для этих целей.Теперь о C ++ \ CLI-коде в заголовочном файле:
HINSTANCE hDelphiDLL;
typedef void (*pPBDFUNC)(byte* aBytes, int size);
pPBDFUNC Convert;
В cpp я устанавливаю Convert in constructor:
hDelphiDLL = LoadLibrary(<path to dll>);
if(NULL != hDelphiDLL ){
pPBDFUNC clb= GetProcAddress(HMODULE(hDelphiDLL), "Convert");
if(NULL != clb){
Convert= pPBDFUNC (clb);
}...
И последний метод, который я вызываю из C #:
void Class1::Test(byte* aBytes, int size){
Convert(aBytes,size);
}