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