2013-02-23 2 views
0

문제가 있습니다. 나는 다음과 같이 정의 내 DLL에서 함수가 : 나는 성공적에서 LoadLibrary를 사용하여 콘솔 응용 프로그램에서 내 DLL을로드DLL에서 char * 가져 오기

int function(char *inVal, char *outVal, int *retVal) 

을, 난 함수 포인터 내 함수를 호출 : 다음

typedef int (__cdecl *functionPtr)(char *, char *,int *); 

를 I 내 함수 내 inval이 통과 :

char * inVal = "input"; 

지금 내 outVal 및 RETVAL 싶어, 나는 성공적으로 RETVAL 가지고있다하지만 내 outVal은 NULL입니다 :

int retVal = 0; 
char outVal[200] = {0}; 

는 내 함수를 호출 :

int return = functionLNK(inVal , outVal, &retVal) 

단서를!?

EDIT 1

코드는 다음과 같이된다 :

int function(char *inVal, char *outVal, int *retVal) 

{ 

PKI_Buf inBuf, signBuf, pemBuf; 

...... 


outVal = (char*)pemBuf.data; 

//I check outVal in this point and it is not NULL 

} 
+0

내 dll의 로그를 확인했는데 내 dll의 outVal이 NULL이 아닙니다. – A23149577

+0

'char outVal [200] = {0};'을 (를) 사용하셨습니까? –

+0

예 제가 편집했습니다 – A23149577

답변

2

문제 function으로한다. outVal을 값으로 전달합니다. 즉, 함수 안에있는 포인터는 전달한 포인터의 복사본입니다. 그런 다음 포인터에 outVal = (char*)pemBuf.data;을 할당합니다. 복사 한 내용 만 수정하면됩니다. 외부에서는 변경이 발생하지 않습니다.

그러나이 방법이 유일한 문제는 아닙니다. 또한 범위를 벗어날 객체의 멤버에 대한 포인터를 전달하려고합니다. pemBuf은 (자동으로 function에 국한되기 때문에) 자동 저장 기간이 있습니다. 이는 반환시 파괴된다는 것을 의미합니다. 그런 다음 포인터가 잘못된 개체를 가리키고 있습니다.

대신에 이 가리키는 배열 요소로 pemBuf.data의 내용을 복사하는 것이 좋습니다. std::copy 또는 strcpy으로이 작업을 수행 할 수 있습니다. 그러나 버퍼의 크기를 넘지 않는 또 다른 문제가 있습니다. 배열의 크기는 알 수 없습니다 (pemBuf.data 배열의 크기는 알 수 없음). 당신은 그러나, N로 복사하는 방법을 많이 알고 가정하면, 당신은 할 수 :

std::copy(pemBuf.data, pemBuf.data + N, outVal); 

그러나, 코드가 매우이다 C와 같은 - 그래서 C 스타일의 문자열 출력 매개 변수 등을 사용. std::string을 사용하시기 바랍니다.