2010-05-31 2 views
1

관리되는 (Delphi .NET) 함수에서 관리되지 않는 (Delphi의 Win32 DLL) 함수로 유니 코드 문자열을 전달 (마샬링) 할 수있는 방법에 대해 누구나 감사드립니다. .유니 코드 문자열을 관리되는 함수에서 관리되지 않는 함수로 전달하는 방법

관리되는 환경 (델파이 .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; 

... 

관리되지 않는 환경 (델파이는 Win32 DLL) :

library TM.PROFileConverter; 

... 

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

exports 
    ImportLineworksFromPROFile; 

... 

이 시간 내 주셔서 감사합니다.

답변

3

.Net. 따라서 Delphi for .NET은 win32 Delphi의 AnsiString을 정렬 할 수 없습니다. PChar를 마샬링하는 방법을 알고 있습니다. Win32 매개 변수를 PChar로 변경하면 효과가 있습니다.

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

PS : 관리되지 않는 기능은 유니 코드가 아닌 ANSI 인코딩을 사용합니다. 관리되지 않는 코드가 유니 코드를 처리하도록하려면 관리되는 쪽에서 PChar 및 CharSet = CharSet.Unicode 대신 PWideChar 또는 WideString을 사용해야합니다.

+1

또한 D2007이 PChar = PAnsiChar 인 마지막 버전 이었음을 주목할 필요가 있습니다. D2009에 유니 코드 지원이 추가되어 PChar가 PWideChar로 변경되었습니다. 업그레이드 할 경우 DllImport를 CharSet.Unicode를 사용하도록 변경해야합니다 (그렇지 않으면 ANSI를 유지하도록 DLL을 변경해야합니다). –

0

Delphi.NET이 어떻게 처리하는지 잘 모르겠지만 기본 Win32 Delphi와 C# .NET 코드를 조합 한 경험이 있으며 COM InterOp를 사용할 수 있다면 TLB 클래스 라이브러리 가져 오기 단위가 표시됩니다 WideString을 사용하고 당신을 위해 인터페이스를 처리하십시오, 그래서 나는이 방향으로 연구 할 것입니다.

관련 문제