How Unicode strings can be passed from a managed to an unmanaged function

378 Views Asked by At

I will really appreciate anybody's help about how a Unicode string can be passed (marshaled) from a managed (Delphi .NET) to an unmanaged (Delphi's Win32 DLL) function.

The managed environment (Delphi .NET):

...

interface

...

const TM_PRO_CONVERTER = 'TM.PROFileConverter.dll';

function ImportLineworksFromPROFile(FileName          :String; 
                                    TargetFileNameDXF :String): Integer;

...

implementation

...

[DllImport(TM_PRO_CONVERTER, EntryPoint = 'ImportLineworksFromPROFile', 
           CharSet = CharSet.Ansi, SetLastError = True, 
           CallingConvention = CallingConvention.StdCall)]

function ImportLineworksFromPROFile(FileName          :String; 
                                    TargetFileNameDXF :String): Integer; external;

...

The unmanaged environment (Delphi's Win32 DLL):

library TM.PROFileConverter;

...

function ImportLineworksFromPROFile(FileName          :String;
                                    TargetFileNameDXF :String) :Integer; stdcall;

exports
  ImportLineworksFromPROFile;

...

Thank you for your time.

2

There are 2 best solutions below

0
On

I don't exactly know how the Delphi.NET handles things, but I have some experience with combining native win32 Delphi and C# .NET code and if you can use COM InterOp, you will see the TLB class library import units use WideString and handle the interfacing for you, so I'd research in this direction.

1
On

.Net, and therefore Delphi for .Net, can not marshal win32 Delphi's AnsiString. It does know how to marshal PChar. Changing the win32 parameters to PChar should work.

function ImportLineworksFromPROFile(FileName          :PChar;
                                    TargetFileNameDXF :PChar) :Integer; stdcall;

PS: The unmanaged function uses ANSI encoding, not Unicode. If you want your unmanaged code to handle unicode you should use PWideChar or WideString instead of PChar and CharSet = CharSet.Unicode on the managed side.