2013-04-02 2 views
2

델파이에서 개발 된 DLL의 기능을 사용할 수 없습니다. 유형 변환에 어려움을 겪고 있습니다. C++에서델파이 DLL을 사용하는 C++

function rData(ID: Cardinal; queue: WideString): WideString; stdcall; 

내 코드가 되니라 :

내가 DLL을 호출 할 수있는 기능입니다

typedef string (*ReturnDataSPL)(DWORD, string); 

string result; 
HMODULE hLib; 
hLib = LoadLibrary("delphi.dll"); 
pReturnDataSPL = (ReturnDataSPL)GetProcAddress(hLib,"rData"); 
if (NULL != pReturnDataSPL) 
    result = pReturnDataSPL(JobID,printerName); 

나는 그것이 작동되도록 할 수 아니에요 문제. Delphi WideString 및 Cardinal과 호환되는 유형을 알지 못합니다.

누군가가 도움이 나를

편집 :

procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall; 

코드를 변경 한 후이 모습 :

이 내가 DLL 호출 할 함수입니다

typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&); 

HMODULE hLib; 
BSTR result = NULL; 
hLib = LoadLibrary("delphi.dll"); 

pReturnDataSPL = (ReturnDataSPL)GetProcAddress(hLib,"rData"); 
if (NULL != pReturnDataSPL) 
{ 
    pReturnDataSPL(JobID,(BSTR)"Lexmark X656de (MS) (Copiar 2)",result); 
} 

답변

11

당신은 그 기능을 할 기회가 거의 없습니다.

stringstd::string이라고 가정하기 때문에 현재 코드를 시작하기에 성공할 수 없습니다. 이것은 Delphi 코드가 제공하거나 사용할 수없는 C++ 데이터 유형입니다. Delphi의 WideString과 일치 시키려면 COM BSTR 데이터 형식을 사용해야합니다.

코드의 또 다른 문제점은 C++ 측에서 cdecl을 사용하고 델파이 측에서 stdcall을 사용한다는 것입니다. 호출 규칙을 정렬해야합니다.

그러나 반환 값에 대한 델파이의 ABI와 플랫폼 표준의 차이로 인해 실패 할 수도 있습니다. 그 주제는 여기에 자세히 설명했다 : Why can a WideString not be used as a function return value for interop?

가장 좋은 방법은 반환 값으로 WideString 사용을 중지하고, C++ 참조 매개 변수로 변환하는 것입니다. 델파이를 일치 시키려면 변환해야합니다.

당신은 이런 일을 찾고 있습니다 :

델파이

procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall; 

C++

typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&); 
+0

I는 위의 코드 변경 : 을하지만 기능은 I을 실행할 때 예외가 발생했습니다 : 'C에서 0x772b15ee의 처리되지 않은 예외 allbackSample.exe : 0xC0000005 : 0x00000000 위치를 읽는 액세스 위반. ' 무엇이 될 수 있습니까? 고맙습니다. – msantiago

+2

C++ 코드가 제 코드와 일치하지 않습니다. 세 번째 매개 변수는 참조로 전달되어야합니다. 코드와 광산의 차이점을 비교하십시오. 또한 BSTR을 존재로 만들 수 없습니다. 실제 BSTR을 만들어야합니다! –

+0

SysAllocString은 BSTR을 만듭니다. 또는 BSTR 편리한 래퍼 중 하나를 사용하십시오. –

관련 문제