2012-06-24 3 views
4

// 델파이 코드 :C#에서이 델파이 .dll 함수를 호출하는 방법?

function GetLoginResult:PChar; 
    begin 
    result:=PChar(LoginResult); 
    end; 

델파이 기능보다 사용하기 // C# 코드 (나는, unity3d 사용하고 내, C 번호) (델파이 버전은 터보 델파이 익스플로러 (이것은 2006 델파이)이다)

[DllImport ("ServerTool")] 
private static extern string GetLoginResult(); // this does not work (make crash unity editor) 

[DllImport ("ServerTool")] 
[MarshalAs(UnmanagedType.LPStr)] private static extern string GetLoginResult(); // this also occur errors 

C#에서 해당 함수를 사용하는 올바른 방법은 무엇입니까?

(델파이로도 사용할 수 있도록, 코드 등 경우 (이벤트 = 1), (태그 = 10) 그런 경우 Writeln ('로그인 결과 :'GetLoginResult))

+0

도움이 될 수 있습니다. http://stackoverflow.com/questions/5086645/how-to-use-delphi-dllwith-pchar-type-in-c-sharp –

답변

8

대한 메모리 문자열은 델피 코드가 소유하고 있지만 p/invoke 코드는 해당 메모리에 CoTaskMemFree을 호출하는 마샬 러가됩니다.

마샬 러에게 메모리를 해제해야하는 책임을지지 않는다는 것을 마샬 러에게 알리는 것이 필요합니다.

[DllImport ("ServerTool")] 
private static extern IntPtr GetLoginResult(); 

그런 다음 Marshal.PtrToStringAnsi()을 사용하여 반환 된 값을 C# 문자열로 변환하십시오.

IntPtr str = GetLoginResult(); 
string loginResult = Marshal.PtrToStringAnsi(str); 

또한 델파이 함수를 선언하여 호출 규칙에 일치 stdcall 할 수 있는지 확인해야합니다 : 그래서이 호출 규칙의 부정합이 문제가되지 않는 일이 있지만

function GetLoginResult: PChar; stdcall; 

함수에는 매개 변수가없고 포인터 크기 반환 값이 있습니다.

이 모든 기능을 수행하려면 이 반환 한 후에 해당 내용이 유효하도록 Delphi 문자열 변수 LoginResult이 전역 변수 여야합니다.

+0

이 경우에도 호출 규칙이 중요합니까? – Petesh

+0

@Petesh는 함수에 params가없고 반환 값이 stdcall과 register에 대해 동일하게 처리되므로 사실 no입니다. 그러나 델파이가 stdcall로서의 기능을 선언하는 것이 더 낫습니다. 고마워. –

+0

msll (http://msdn.microsoft.com/ko-kr/library/e765dyyy.aspx)에서 설명한대로 marshaller에서 문자열로 DllImport 함수의 반환 값을 올바르게 정의하면 올바르게 처리 할 수 ​​있습니다. –

관련 문제