2013-03-12 3 views
0

DLL에 일반적으로 변수를 저장하는 자체 힙이 있다는 것을 알고 있습니다. 내 DLL 함수는 wchar_t 변수에 대한 포인터를 사용하며 값을 입력하려고 할 때마다 함수, 힙이 파괴되기 때문에 내가 추측하고있는 잘못된 위치를 가리키는 포인터를 남겨 둡니다.DLL 함수의 반환 값

내 DLL 함수가 다시 전달해야하는 일종의 데이터가 나오면 누군가가 그 데이터를 원래 주 함수로 다시 가져올 수있는 방법을 보여줄 수 있습니까? Visual Studio를 사용

2010

편집 : 나는 일부 샘플 코드를 제공 할 수 있지만 단순히 메모리와 관련하여 처리하는 방법에 관한 예/설명 부탁 해요 때문에 나는 점을 보지 못했다 DLL과 그 기능. 필요한 정보가 무엇인지 물어 보면 전달해 보겠습니다.

글쎄, 여러분에게 응용 프로그램이하는 일에 대한 아이디어를 제공하기 위해, 그것은 COM 서버 DLL입니다. 인터페이스는 IProperty이고, 객체는 PropertyObject입니다. DLL은 나에 의해 PropertyObject 메서드로 별도로 만들어졌습니다. 이 메소드 인 Getproperty가 제가 작업하고있는 메소드입니다.

STDMETHODIMP PropertyObject::GetProperty(int arg1, wchar_t* arg2) 
{ 
    arg2 = L"Test"; 
    cout << *arg2 << endl; 
    return S_OK; 
} 

int main() 
{ 

CoInitialize(NULL); 

IClassFactory * pClassFactory = NULL; 
HRESULT hr; 
hr = CoGetClassObject(
CLSID_PropertyObject, 
CLSCTX_SERVER, 
NULL, 
IID_IClassFactory, 
(void **) &pClassFactory); 

if (SUCCEEDED(hr)) 
{ 
    wchar_t x = NULL; 
    IProperty *pProperty = NULL; 

    hr = pClassFactory->CreateInstance(NULL, IID_IProperty, (void **) &pProperty); 
    hr = pProperty->GetProperty(2, &x); 
    cout << x << endl; 
} 
    return 0; 
} 
+1

기존 코드가 도움이됩니다. 그러면 우리는 당신이하려고하는 것을 더 잘 볼 수 있습니다. 대부분 쓰기를 시도하기 전에 메모리를 할당하지 못한 것 같습니다. –

+0

확인 http://stackoverflow.com/questions/2266218/memory-heap-management-across-dlls – devshorts

+0

각 DLL에 자체 힙이 있다는 아이디어가 있습니까? 적어도 세 가지 다른 환경에서 DLL을 광범위하게 사용했으며 한 DLL에 할당하는 데 문제가 없었으며 다른 DLL에서 자유롭게 사용했습니다. (하나의 DLL에서 생성하고 다른 DLL에서'dynamic_cast'를 수행하는 데 문제가있었습니다.) –

답변

0

당신은 모든 참여 프로그램이 (그들은 모두 문자열의 부분은 STD STL과 동일한 버전의 :: 사용을 의미)의 Visual Studio와 동일한 버전으로 컴파일하고 있다는 사실에 대해 100 % 확신하는 경우 std :: string 클래스를 사용할 수 있습니다.

상호 운용성이 필요한 경우 가장 좋은 방법은 char *와 길이를 전달하여 제공된 버퍼에 기록하는 것입니다. 호출자가 메모리를 처리하게하십시오. 그것은 꽤 C 스타일이지만, 가장 안전한 내기입니다.

0

밝혀졌습니다. wchar_t 포인터는 여전히 일반 문자 배열처럼 생각했습니다. 여기 내 수정 코드 :

STDMETHODIMP PropertyObject::GetProperty(int arg1, wchar_t* arg2) 
{ 
    wcscpy(arg2, L"Test"); // This is the function that i needed to be using. 
    return S_OK; 
} 



int main() 
{ 
    CoInitialize(NULL); 

IClassFactory * pClassFactory = NULL; 
HRESULT hr; 
hr = CoGetClassObject(
CLSID_PropertyObject, 
CLSCTX_SERVER, 
NULL, 
IID_IClassFactory, 
(void **) &pClassFactory); 

if (SUCCEEDED(hr)) 
{ 
    wchar_t *x = new wchar_t; // Before, this was a normal variable. Changed it to a pointer. 
    IProperty *pProperty = NULL; 

    hr = pClassFactory->CreateInstance(NULL, IID_IProperty, (void **) &pProperty); 
    hr = pProperty->GetProperty(2, x); // Passed the pointer instead of an address to a normal variable. 
    wcout << x << endl; // wcout instead of cout. It worked. 
} 
    return 0; 
} 
+0

"일반 문자 배열처럼 wchar_t 포인터를 계속 고려했습니다." 그것은 정말로 문제가 아니 었습니다. 문제는 버퍼를 채우는 대신 포인터 인 주소를 수정했다는 것입니다. –