Tôi đang cố gắng sử dụng một dll C++ từ một chương trình gốc. Tôi đang theo kịch bản phương pháp ảo như được giải thích hereDelphi PChar đến C++ const char *
phép nói rằng C++ chức năng chữ ký của tôi có dạng
int Setup(const char* szIp, const char* szPort);
Và chữ ký delphi tương ứng là
function Setup(ip, port: PChar):Integer: virtual; cdecl; abstract;
Và ở đâu đó từ chương trình delphi tôi có thể gọi
pObj.Setup('192.168.1.100', '97777');
c ontrol đi vào dll, nhưng szIp và szPort thông số chính thức chỉ nhận được ký tự đầu tiên của ip và cổng mà tôi đã vượt qua từ chương trình delphi.
Tôi hiểu rằng nó có liên quan đến việc vô hiệu hóa chuỗi đúng cách trong delphi. Vì vậy, tôi đã thử những điều sau đây quá.
var
pzIp, pzPort: PChar;
szIp, szPort: string;
begin
szIp := '192.168.1.2';
szPort := '9777';
//initilize memory for pchar vars
GetMem(pzIp, Length(szIp)+1);
GetMem(pzPort, Length(szPort)+1);
//null terminate the strings
pzIp[Length(szIp)+1] := #0;
pzPort[Length(szPort)+1] := #0;
//copy strings to pchar
StrPCopy(pzIp, szIp);
StrPCopy(pzPort, szPort);
end.
Điều này cũng hoạt động. Khi tôi Writeln
pzIp
và pzPort
Tôi nhận được kết quả lạ.
Quên để nói, tất cả các chức năng thành viên từ ++ dll C được biên soạn với __stdcall
và xuất khẩu đúng
Cảm ơn bạn đã giải thích chi tiết hơn: câu trả lời của tôi là một suy nghĩ nhanh chóng đã chứng minh đúng, nhưng tôi khuyên đây là câu trả lời để được chấp nhận. – IanH
Cảm ơn @Deltics, đã hoạt động. Một thay đổi nhỏ mặc dù, cần thiết để được đúc để làm cho chương trình delphi biên dịch pObj.Setup (PAnsiChar (sIPAddress), PAnsiChar (sPort)); Đặc biệt cảm ơn @IanH – rptony