Cách tốt nhất là sử dụng WideString.
Vì nhiều lý do.
- Đó là Unicode và các công trình trước khi D2009
- Đó là bộ nhớ được quản lý trong ole32.dll, vì vậy không phụ thuộc vào một trong hai nhà quản lý bộ nhớ của Delphi hoặc CLR GC.
- Bạn không cần phải đối phó trực tiếp với con trỏ
Trong Oxygene, bạn có thể viết nó như vậy:
type
Sample = static class
private
[UnmanagedExport]
method StringTest([MarshalAs(UnmanagedType.BStr)]input : String;
[MarshalAs(UnmanagedType.BStr)]out output : String);
end;
implementation
method Sample.StringTest(input : String; out output : String);
begin
output := input + "ä ~ î 暗";
end;
"MarshalAs" kể CLR làm thế nào để sắp xếp chuỗi lui. Nếu không có nó, các chuỗi được chuyển thành Ansi (PAnsiChar), có lẽ là NOT những gì bạn muốn làm.
Đây là làm thế nào để sử dụng nó từ Delphi:
procedure StringTest(const input : WideString; out output : WideString);
stdcall; external 'OxygeneLib';
var
input, output : WideString;
begin
input := 'A b c';
StringTest(input, output);
Writeln(output);
end.
Ngoài ra, bao giờ loại sử dụng, không được xác định rõ ràng, đối với các giao diện bên ngoài. Bạn không được sử dụng PChar để nhập hoặc xuất DLL. Vì nếu bạn làm như vậy, bạn sẽ gặp phải các ngoại lệ khi bạn biên dịch nó với D7 hoặc D2009 (tùy thuộc vào hệ thống dev gốc)
Nguồn
2010-02-16 18:32:14
Đây là một cộng đồng, do đó bạn không nên áp đặt một người trong câu hỏi của mình. Nếu bạn muốn làm điều đó viết bình luận cho câu trả lời của mình. Nếu bạn viết một câu hỏi (tốt hơn trong trường hợp này), hãy cố gắng xây dựng câu hỏi đó càng chung càng tốt. – jpfollenius
Đồng ý. Robert Giesecke đã trả lời điều này tốt hơn tôi có thể có. –