从DLL函数返回值



我知道DLL通常有自己的堆来存储变量。我的DLL函数接受一个指向wchar_t变量的指针,每当我尝试在其中放置一个值时,它就会退出函数,使指针指向一个错误的位置,我认为这是因为堆被销毁了。

如果我的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;
}

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

如果需要互操作,最好的方法是传入char*和长度,然后写入所提供的缓冲区。让调用者处理内存。

原来我还在考虑一个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;
}

最新更新