2014-05-23 2 views
-1

Vb6 코드가 다음 오류에서 실행됩니다.어떻게 델파이 dll 함수에서 pchar 형식을 반환 할 수 있습니까?

오류를 어떻게 해결할 수 있습니까?

정상적인 문자열을 반환하려면 어떻게해야합니까?

VB6 코드

Private Declare Function DllPchar Lib "C:\TEST\Project2.dll" (ByVal AStr As String) As String 

Private Sub Command10_Click() 
    Dim tmp as String 
    tmp = DllPchar("123"); 
End Sub 

Delphi7 코드

function DllPchar(AStr: PChar) : PChar; stdcall; 
+0

어떤 오류가 있습니까? 그것을 전부 보여주십시오. –

+0

또한'PChar'는 Delphi 2009 및 이후 버전에서는'PWideChar'이지만 이전 버전에서는'PAnsiChar'입니다. 이는 DLL이 작성된 델파이 버전에 따라 interop 연산에 영향을줍니다. –

+0

감사합니다. 매우 도움이되었습니다, 감사합니다. 문제가 해결되었습니다. 다시 한번 감사드립니다. – user3669271

답변

3

음은, 당신은이 문제에 대한 많은 정보를 제공하지 않았습니다. 예를 들어, 오류 메시지. 델파이는 "DllPChar"를 코딩합니다.

하지만 신경 쓰지 마세요. 내가 먼저 알아 차린 것은 Declare Function 문이 String을 반환한다는 것입니다. VB에서 BSTR 유형의 값이 반환되기를 기대하기 때문에 이는 작동하지 않습니다. 델파이는 BSTR과 호환되는 WideString 유형이 있습니다.

VB 문자열이 내부적으로 UTF-16, 즉 COM 메모리 관리자가 할당 한 문자 당 2 바이트의 유니 코드 문자열이기 때문에 이것이 중요한 이유입니다. Delphi PAnsiChar 형식은 8 비트 ANSI 문자에 대한 포인터이며 Delphi 문자열은 Delphi의 자체 메모리 관리자가 할당합니다. 호환되지 않습니다. 그러나 ByVal ... As String 매개 변수로 Declare Function을 사용할 수 있고 VB 문자열과 PAnsiChar 사이에서 VB 핸들 및 자동 변환을 사용하여 호출을 전에 호출 한 다음 호출 후에 PAnsiChar와 VB 문자열 을 호출하는 특별한 경우가 있습니다.

델파이에서 BSTR을 사용할 수없는 경우 가장 좋은 방법은 AStr 매개 변수를 수정하도록 DllPchar()을 다시 작성하는 것입니다. 또는 값을 반환하는 새 매개 변수를 만듭니다.

ByVal 대신 AStrByRef으로 수정하여 수정할 수 있습니다. 이렇게하면 VB에서 유니 코드 문자열을 전달할 수 있습니다. 그런 다음 반환 값을 통해 결과를 반환합니다.

+0

감사합니다. 매우 도움이되었습니다, 감사합니다. 문제가 해결되었습니다. 다시 한번 감사드립니다. – user3669271