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

时间:2012-08-10 15:32:42

标签: c++ pointers structure

假设我的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;

3 个答案:

答案 0 :(得分:2)

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的责任。

答案 1 :(得分:0)

您可以将功能更改为

void *func(int,void *) 

并返回新结构 - 但请注意,必须使用new或malloc在堆上分配它,然后通过调用者释放空闲或删除

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

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

答案 2 :(得分:-1)

您是用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的引用。但是在尝试之前,您可能想了解内存处理和内存泄漏。