2015-02-04 3 views
-1

저는 Delphi 6 개발자입니다. 델파이에서 C++ dll 함수를 호출하려고합니다. C++로 작성된 Dll이며 out 매개 변수로 Char 포인터가 있습니다.참조로 함수로 전달되는 변수의 메모리 주소를 읽을 수 없습니다.

예 : 나는 숯불 통과하기 때문입니다 내가 DLL에서 함수를 호출 할 때

Function doGetStatus(Var szStatusData : Char) : Integer; cdecl; external 'WhizCal.dll'; 

나는 'szStatusData'문자 변수를 보내고 반환 값은 '다운'또는 '라이브'해야하지만, 그것은 단지 'D'또는 'L'을 retuens 변수 참조. 내 질문은, 데이터 형식을 변경하지 않고 반환 데이터를 '아래'또는 '라이브'로 가져 오려면 어떻게해야합니까?

답변

1

char은 하나의 문자입니다. 그래서 더 이상 기대할 수 없습니다.

대부분의 C++ 코드는 문자 배열에 대한 포인터가 전달 될 것으로 예상됩니다.

function doGetStatus(szStatusData: PAnsiChar): Integer; cdecl; external 'WhizCal.dll'; 

그리고 당신은 다음과 같이 호출 수 있습니다 : 아마도 그것은 다음과 같이해야한다

var 
    StatusData: array [0..255] of AnsiChar; 
    RetVal: Integer; 
.... 
RetVal := doGetStatus(StatusData); 
// check RetVal 

우리는 우리가 지정된 모든 세부 사항이 없기 때문에 정확히 코드가 무엇을해야 당신을 말할 수 없다 인터페이스. 호출자가 배열의 길이를 전달하지 않으면 이러한 함수는 버퍼 오버런 오류에 대한 미끼입니다. 위에서 설명한 것처럼 이것이 사실입니다. 발신자는 할당 할 공간을 어떻게 알 수 있습니까? 또한 잘 설계된 함수를 사용하면 호출자가 제공 한 배열의 길이를 전달할 수 있습니다.

내 일반적인 조언은 interop가 정밀도와 세부 사항을 요구하고 경계의 양쪽에 대한 지식이 필요하다는 것입니다. 세부 사항을 찾아야합니다.

+0

suggesssion에 감사드립니다. 이제는 일부 기능이 제대로 작동합니다. – Amruta

+0

그럼이게 답입니까? –

+0

정확히는 아니지만 하나의 out 매개 변수 만 갖는 함수에 대한 작업. 안으로 및 밖으로 매개 변수가 필요한 다른 c 함수를 호출해야합니다. 하지만 당신이 제안한 변경 사항으로 함수를 호출하면 함수 호출이 끝날 때 액세스 위반이 표시됩니다. 귀하의 suggessions을 가지고 그 즐거움. 미리 감사드립니다. – Amruta

관련 문제