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

C++ C/C++;-传递给DLL中函数的指针,c++,pointers,structure,C++,Pointers,Structure,假设我的DLL中有以下函数: void TestFunction(int type, void* data) 现在,从加载该DLL的应用程序调用该函数。应用程序初始化结构并向该函数发送指向该结构的指针: SampleStruct strc; TestFunction(DT_SS, &ss); 到目前为止还不错。现在困扰我的是如何用另一个结构替换内存中的strc变量。如果我在dll中执行以下操作: SampleStruct dllstrcc; data = &dllstrcc;

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

void TestFunction(int type, void* data)
现在,从加载该DLL的应用程序调用该函数。应用程序初始化结构并向该函数发送指向该结构的指针:

SampleStruct strc;
TestFunction(DT_SS, &ss);
到目前为止还不错。现在困扰我的是如何用另一个结构替换内存中的strc变量。如果我在dll中执行以下操作:

SampleStruct dllstrcc;
data = &dllstrcc;
数据现在将指向新的dllstrc结构,但是当它存在函数且控件返回应用程序时,strc仍将指向第一个结构。如何用dll中的结构替换应用程序的结构而不指定每个字段:

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

您可以将函数更改为

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

顺便说一句,默认的赋值运算符不满足您的需要吗

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

一,。最简单的选项是复制整个结构:

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

SampleStruct strcc;
TestFunction(type, &strcc);
好处是你不必担心释放内存等等

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

void* TestFunction(int type) {
    SampleStruct* pdllstrcc = new SampleStruct();
    return pdllstrcc;
}
(我将
返回
新结构,因为它更简单,但如果需要,可以使用
void**data
通过参数传递)

您可以调用以下函数:

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

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

< P>你是用C还是C++?< /P>编码? 第一:如果要像这样调用函数:

SampleStruct strc;
TestFunction(DT_SS, &strc);
SampleStruct strc;
SampleStruct * pstrc = & strc;
TestFunction(DT_SS, pstrc);
void TestFunction(int type, SampleStruct * & data)
你不能。替换
和strc
意味着什么?您正在尝试替换结构的地址?那没有意义。同样在C++中,你不使用<代码> Value*/Cuff>,你使用<代码> Spple Stult*< /Calp>

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

SampleStruct strc;
TestFunction(DT_SS, &strc);
SampleStruct strc;
SampleStruct * pstrc = & strc;
TestFunction(DT_SS, pstrc);
void TestFunction(int type, SampleStruct * & data)
现在,如果您这样编写函数,则可以用结果替换pstrc:

SampleStruct strc;
TestFunction(DT_SS, &strc);
SampleStruct strc;
SampleStruct * pstrc = & strc;
TestFunction(DT_SS, pstrc);
void TestFunction(int type, SampleStruct * & data)
请注意
&
,这意味着您将指针数据作为引用传递。
现在您可以编写
data=&dllstrc
,它将修改
pstrc
,因为
data
不是变量,而是对
pstrc
的引用。但是,在尝试之前,您可能想了解内存处理和内存泄漏。

首先让我注意到,听起来好像您正在走上未定义的行为(通过向本地数据分发指针),并指出应该避免C++(如“代码”>空/ *>之类的构造(C++中没有双关语)(因为大多数时间都是可能的)。也就是说:那指针的引用/指针呢,它可以让你替换调用方站点上的指针吗?@事实上,没有人认为它不是一个空的*但可以说它归结为空的。至于指向指针的指针,我既不能控制应用程序,也不能控制dll函数。但是函数中的代码在我的控制之下,如果你被这个接口束缚住了,你就无能为力了。