У меня есть 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;
он отлично работает, но из С++, если выдает AV на SetString.
Пожалуйста, помогите мне с этим.
От РредКэт:
Позвольте мне немного пояснить вопрос Юрия: Прежде всего о языках, которыми мы пользуемся. Нам нужно вызвать Delphi dll в проекте C#. Я создал слой C++\CLI (прокси) для этих целей. Теперь о коде C++\CLI в заголовочном файле:
HINSTANCE hDelphiDLL;
typedef void (*pPBDFUNC)(byte* aBytes, int size);
pPBDFUNC Convert;
В cpp я устанавливаю Convert в конструкторе:
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);
}
TBytes
не нужен. Просто используйтеM.Memory
иM.Size
. 2. Что касается самого вопроса, покажите нам С++. Или C#, что бы это ни было на самом деле. - person David Heffernan   schedule 01.02.2012