2010-05-31 5 views
1

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

Управляемая среда (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, Win32 DLL):

library TM.PROFileConverter; 

... 

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

exports 
    ImportLineworksFromPROFile; 

... 

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

ответ

3

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

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

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

+1

Возможно, также стоит отметить, что D2007 была последней версией, где PChar = PAnsiChar. D2009 добавила поддержку Unicode, которая изменила PChar на PWideChar. Если вы обновляете, DllImport затем должен быть изменен для использования CharSet.Unicode (или вам придется изменить DLL, чтобы оставаться ANSI). –

0

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