C/C++ - 传递给 DLL 中函数的指针

C/C++ - Pointer passed to function in DLL

本文关键字:DLL 函数 指针 C++      更新时间:2023-10-16

假设我的DLL中有以下函数:

void TestFunction(int type, void* data)

现在,该函数是从加载该 DLL 的应用程序调用的。应用程序初始化一个结构,并将指向该结构的指针发送到该函数:

SampleStruct strc;
TestFunction(DT_SS, &ss);

目前为止,一切都好。现在困扰我的是如何用另一种结构替换内存中的 strcc 变量。如果我在我的 dll 中执行以下操作:

SampleStruct dllstrcc;
data = &dllstrcc;

数据现在将指向新的 DLLSTRCC 结构,但是当它存在函数并且控件返回到应用程序时,strc 仍将指向第一个结构。如何在不分配每个字段的情况下将应用程序的结构替换为 dll 中的结构:

data.vara = dllstrcc.vara;
data.varb = dllstrcc.varb;
data.varc = dllstrcc.varc;

1. 最简单的选择是复制整个结构:

void TestFunction(int type, void* data) {
    SampleStruct dllstrcc;
    // fill dllstrcc here...
    SampleStruct *p_ret = data;
    *p_ret = dllstrcc;
}

并通过以下方式调用它

SampleStruct strcc;
TestFunction(type, &strcc);

好处是您不必担心释放内存等。

2.如果确实要替换调用方的结构(具有新结构),则可以在DLL中分配新结构。

void* TestFunction(int type) {
    SampleStruct* pdllstrcc = new SampleStruct();
    return pdllstrcc;
}

(我将return新结构,因为它要容易得多,但是如果需要,您可以使用void** data通过参数将其传递出去。

您可以像这样调用该函数:

SampleStruct *strcc = TestFunction(type);
// do something with the struct
delete strcc;

不要忘记删除指针,否则会泄漏内存。应明确决定谁负责释放内存、调用方或 DLL。

您可以将函数更改为

void *func(int,void *) 

并返回新结构 - 但请注意,它必须使用 new 或 malloc 在堆上分配,然后由调用方使用 free 或 delete 释放

顺便说一句,默认赋值运算符不做你需要的吗?

sampleStruct newStruct;
sampleStruct *tmp=(sampleStruct *)data;
*tmp=newStruct;

你是用 c 还是用 c++ 编码?

第一:如果你想像这样调用函数:

SampleStruct strc;
TestFunction(DT_SS, &strc);

你不能。 替换&strc意味着什么?您正在尝试替换结构的地址?这没有任何意义。同样在C ++中,您不使用void *,而是使用SampleStruct *

如果你想替换一些东西,你必须这样称呼它:

SampleStruct strc;
SampleStruct * pstrc = & strc;
TestFunction(DT_SS, pstrc);

现在你可以用你的结果替换 pstrc,如果你像这样编写你的函数:

void TestFunction(int type, SampleStruct * & data)

请注意&,这意味着您将指针数据作为引用传递。现在你可以写data = & dllstrcc;,它会修改pstrc,因为data不是变量,而是对pstrc的引用。但是,在尝试之前,您可能需要了解内存处理和内存泄漏。