Tôi có một DLL Delphi mà tôi không viết, nhưng cần phải gọi từ một ứng dụng C# ASP.NET 3.5. Dưới đây là định nghĩa hàm tôi nhận được từ các nhà phát triển:Gọi một Delphi DLL từ C# tạo ra kết quả bất ngờ
function CreateCode(SerialID : String;
StartDateOfYear, YearOfStartDate, YearOfEndDate, DatePeriod : Word;
CodeType,RecordNumber,StartHour,EndHour : Byte) : PChar;
external 'CreateCodeDLL.dll';
Và đây là mã # C của tôi:
[DllImport("CreateCodeDLL.dll",
CallingConvention = CallingConvention.StdCall,
CharSet=CharSet.Ansi)]
public static extern IntPtr CreateCode(string SerialID,
UInt16 StartDateOfYear,
UInt16 YearOfStartDate,
UInt16 YearOfEndDate,
UInt16 DatePeriod,
Byte CodeType,
Byte RecordNumber,
Byte StartHour,
Byte EndHour);
Và cuối cùng, cuộc gọi của tôi đến phương pháp này:
//The Inputs
String serialID = "92F00000B4FBE";
UInt16 StartDateOfYear = 20;
UInt16 YearOfStartDate = 2009;
UInt16 YearOfEndDate = 2009;
UInt16 DatePeriod = 7;
Byte CodeType = 1;
Byte RecordNumber = 0;
Byte StartHour = 15;
Byte EndHour = 14;
// The DLL call
IntPtr codePtr = CodeGenerator.CreateCode(serialID, StartDateOfYear,
YearOfStartDate, YearOfEndDate, DatePeriod, CodeType,
RecordNumber, StartHour, EndHour);
// Take the pointer and extract the code in a string
String code = Marshal.PtrToStringAnsi(codePtr);
Mỗi lần Tôi biên dịch lại mã chính xác này và chạy nó, nó trả về một giá trị khác. Giá trị mong đợi là mã gồm 10 chữ số bao gồm các số. Giá trị trả về thực sự là 12 chữ số.
Thông tin quan trọng cuối cùng là tôi có một bài kiểm tra .EXE có GUI cho phép tôi kiểm tra DLL. Mỗi thử nghiệm sử dụng .EXE trả về cùng một số có 10 chữ số (kết quả mong đợi).
Vì vậy, tôi phải tin rằng tôi đã tuyên bố cuộc gọi của tôi với DLL không chính xác. Suy nghĩ?
Lưu ý rằng "fastcall" có nghĩa là những thứ khác nhau trong các ngữ cảnh khác nhau. Phiên bản của Microsoft không giống với phiên bản của Embarcadero, và tôi nghi ngờ GCC khác với cả hai. Trong Delphi, quy ước gọi điện không được gọi là "fastcall"; đó là quy ước gọi điện thoại "đăng ký". –