从DLL函数返回值

时间:2013-03-12 16:48:42

标签: c++ function dll

据我所知,DLL通常有自己的堆,它存储变量。我的DLL函数接受一个指向wchar_t变量的指针,每当我尝试在其中放入一个值时,它只是退出函数,留下指针指向一个错误的位置,我假设是因为堆被破坏。

如果我的DLL函数提供了需要传回的某种数据,有人可以给我一个例子,说明如何将字符串格式的数据恢复回原来的main函数吗?

使用Visual Studio 2010.

编辑:我可以提供一些示例代码,但我没有看到这一点,因为我只是想要一个关于如何处理关于dll及其功能的内存的示例/解释。问我需要哪些信息,我会尽力提供。

好吧,为了让你们了解应用程序的功能,它是一个COM服务器DLL。接口是IProperty,该对象称为PropertyObject。我使用PropertyObject方法单独构建DLL。这个方法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;
}

2 个答案:

答案 0 :(得分:0)

如果您100%确定所有参与的程序都使用相同版本的Visual Studio编译(这意味着它们都使用与std :: string属于的STL版本相同的版本),则可以使用std :: string类。

如果它需要可互操作,最好的办法是传入一个char *和一个长度并写入提供的缓冲区。让调用者处理内存。这是非常C风格,但也是你最安全的赌注。

答案 1 :(得分: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;
}