Как строки Unicode могут передаваться из управляемой в неуправляемую функцию - PullRequest
1 голос
/ 31 мая 2010

Я буду очень признателен за помощь в том, как строка Unicode может передаваться (маршалироваться) из управляемой (Delphi .NET) в неуправляемую (Delphi Win32 DLL) функцию.

Управляемая среда (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;

...

Неуправляемая среда (Delphi's Win32 DLL):

library TM.PROFileConverter;

...

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

exports
  ImportLineworksFromPROFile;

...

Спасибо за ваше время.

Ответы [ 2 ]

3 голосов
/ 31 мая 2010

.Net, и, следовательно, Delphi для .Net, не может маршалировать Win32 Delphi's AnsiString. Он знает, как маршал PChar. Изменение параметров win32 на PChar должно работать.

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

PS: неуправляемая функция использует кодировку ANSI, а не Unicode. Если вы хотите, чтобы ваш неуправляемый код обрабатывал Unicode, вы должны использовать PWideChar или WideString вместо PChar и CharSet = CharSet.Unicode на управляемой стороне.

0 голосов
/ 31 мая 2010

Я точно не знаю, как Delphi.NET обрабатывает вещи, но у меня есть некоторый опыт объединения нативного Win32 Delphi и C # .NET кода, и если вы можете использовать COM InterOp, вы увидите импорт библиотеки классов TLB юниты используют WideString и обрабатывают интерфейс для вас, поэтому я бы исследовал в этом направлении.

...