Firstly, since you did not indicate which version of Delphi you are using, I will answer the assumption of Delphi 6 for some other reason than I am familiar with.
Your Delphi routine does not define a calling convention in its declaration, so it will not use stdcall according to your import. It will use the default Delphi register convention, which pushes the first few parameters into registers, rather than onto the stack. If you can modify the Delhpi DLL, add stdcall; after the announcement and adjustment, and your calling agreement will be consistent.
The table below summarizes the calling conventions.
Directive Parameter order Clean-up Passes parameters in registers? --------- --------------- -------- ------------------------------- register Left-to-right Routine Yes pascal Left-to-right Routine No cdecl Right-to-left Caller No stdcall Right-to-left Routine No safecall Right-to-left Routine No
If you look at the .NET documentation, there does not seem to be a calling convention that matches the Delphi register convention (see table below), so I think the only option would be to change the convention in the Delphi DLL.
Member name Description ----------- ------------------------ Cdecl The caller cleans the stack. This enables calling functions with varargs, which makes it appropriate to use for methods that accept a variable number of parameters, such as Printf. FastCall This calling convention is not supported. StdCall The callee cleans the stack. This is the default convention for calling unmanaged functions with platform invoke. ThisCall The first parameter is the this pointer and is stored in register ECX. Other parameters are pushed on the stack. This calling convention is used to call methods on classes exported from an unmanaged DLL. Winapi Supported by the .NET Compact Framework. This member is not actually a calling convention, but instead uses the default platform calling convention. For example, on Windows the default is StdCall and on Windows CE .NET it is Cdecl.
Your Delphi (6) Pchar (null terminated ANSI string pointer) looks right.
source share