2012-08-10 70 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參考。但在嘗試之前,您可能想了解內存處理和內存泄漏。