Tôi có một ứng dụng C# trong đó kêu gọi có nguồn gốc Delphi dll sử dụng đoạn mã sau:Trả về một chuỗi từ delphi dll C# gọi trong 64 bit
C#
[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern int GetString(string out str);
Delphi
function GetString(out a: PChar): Integer; stdcall;
begin
a := PChar('abc');
Result := 1;
end;
hoạt động tốt trong ứng dụng 32 bit. Nhưng khi tôi biên dịch cả hai C# exe và dll Delphi cho 64 bit, tôi nhận được một vấn đề lạ. Sau khi một cuộc gọi đến GetString trong trình gỡ lỗi Delphi tôi có thể thấy rằng một ngoại lệ được nêu ra ở đâu đó trong mã .NET và chuỗi sau xuất hiện trong cửa sổ Debugger Output: "Đã phát hiện lỗi nghiêm trọng c0000374". Google nói rằng lỗi này có liên quan đến tham nhũng đống. Tôi đã thử sử dụng công cụ sửa đổi thông số ref/var thay vì out/out. Vẫn không có may mắn. Tại sao tôi nhận được lỗi này? Tôi có nên sử dụng quy ước gọi điện khác cho 64 bit không?
BTW. Sự kết hợp sau đây hoạt động tốt:
C#
[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern string GetString(string a);
Delphi
function GetString(a: PChar): PChar; stdcall;
var
inp: string;
begin
inp := a;
Result := PChar('test ' + inp);
end;
hoạt động tốt. Nhưng tôi cần trả về một chuỗi như một tham số ngoài.
Cảm ơn bạn rất nhiều! Bạn đã cứu tôi nhiều giờ chiến đấu với vấn đề này. – Max
'PChar'? trò chơi may rủi là 'PAnsiChar' hay' PWideChar'? (có, chúng tôi có thể suy ra nó là XE2 64 bit, nhưng chúng tôi không thể đảm bảo mã này sẽ không được biên dịch với FPC 64 bit hoặc sao chép sang dự án 32 bit, v.v.) –
@ Arioch'The Sau đó sử dụng 'PWideChar' nếu bạn thích. –