Tengo una DLL de Delphi que no escribí, pero necesito llamar desde una aplicación C# ASP.NET 3.5. Esta es la definición de la función que obtuve de los desarrolladores:Llamar a una DLL de Delphi desde C# produce resultados inesperados
function CreateCode(SerialID : String;
StartDateOfYear, YearOfStartDate, YearOfEndDate, DatePeriod : Word;
CodeType,RecordNumber,StartHour,EndHour : Byte) : PChar;
external 'CreateCodeDLL.dll';
Y aquí está mi código C#:
[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);
Y, por último, mi llamada a este método:
//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);
Cada vez Re-compilo este código exacto y lo ejecuto, devuelve un valor diferente. El valor esperado es un código de 10 dígitos compuesto de números. El valor devuelto es en realidad de 12 dígitos.
La última pieza importante de información es que tengo una prueba .EXE que tiene una GUI que me permite probar la DLL. Cada prueba que usa el .EXE devuelve el mismo número de 10 dígitos (el resultado esperado).
Por lo tanto, tengo que creer que he declarado incorrectamente mi llamada a la DLL. ¿Pensamientos?
Tenga en cuenta que "llamada rápida" significa cosas diferentes en diferentes contextos. La versión de Microsoft no es la misma que la de Embarcadero, y sospecho que la de GCC es diferente de ambas. En Delphi, la convención de llamadas ni siquiera se llama "llamada rápida"; es la convención de llamadas de "registro". –