2012-08-10 73 views
3

的功能可以说我有以下功能在我的DLL:C/C++ - 指针传递在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

首先让我注意,它听起来就像你在途中不确定的行为(通过赠送指向本地数据),并指出,构建像'无效*'应避免在C++(没有双关语意)(因为大部分时间都可能)。这就是说:如何引用/指针指针,这将让你更换呼叫者网站上的指针? – Nobody 2012-08-10 15:37:24

+0

@无人在现实中,它不是一个空白*,但可以说它归结为它。至于指针的指针,我不能控制应用程序和dll函数。然而,函数内的代码在我的控制之下。 – oipoistar 2012-08-10 15:43:36

+0

如果你被绑定到那个界面,你可以做的事情不多。 – Nobody 2012-08-10 15:46:38

回答

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

0

您可以将功能改成

void *func(int,void *) 

,并返回新的结构 - 但请注意,它必须在堆上分配新的或malloc,后来释放与免费或删除由调用者

btw,没有默认赋值运算符做你需要什么?

sampleStruct newStruct; 
sampleStruct *tmp=(sampleStruct *)data; 
*tmp=newStruct; 
-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参考。但在尝试之前,您可能想了解内存处理和内存泄漏。