2015-12-15 26 views
0

我有這樣的C++ DLL用下面的函數:訪問指針的參數值從C++ DLL

extern "C" INT16 WINAPI SetWatchElements(INT16 *WatchElements) 
{ 
INT16 Counter; 

//some code 

for (Counter = 0; Counter < WATCHSIZE; Counter++) 
    WatchElements[Counter] = MAPINT(WatchData[Counter]); 

//some code 

return ReturnValue; 
} 

本質上,它只是一些值賦給指針/數組,它是在通過

。當我嘗試通過C#調用這個函數時,我的問題就出現了。這是在C#中的函數定義:

[DLLImport("MyDll.dll")] 
private static extern int SetWatchElements(ref Int16 watchElements); 

和我是怎麼叫它:

Int16 someData = 0; 
var result = SetWatchElements(ref someData); 

編譯沒有和我的變量someData實際上在它的值是正確的。問題在於,因爲在C++世界中,這些值超出了單個值的範圍,所以我不確定如何在C#中訪問這些值。

我試着做這樣的事情:

Int16[] someData = new Int16[80]; 
var result = SetWatchElements(ref someData[0]); 

,但結果是一樣的。 PS:我不能在這裏使用不安全的產品,因爲它違揹我們的標準。

+0

'SetWatchElements(REF someData [0]);'應該已經確定,只要制定出你沒有跨越過程邊界......你有證據證明它失敗了嗎? –

+0

我在控制檯窗口中顯示了所有的值,someData [0]中有一個值,但所有其他索引都是0 – Josh

回答

2

試圖聲明導入函數爲:

[DLLImport("MyDll.dll")] 
private static extern int SetWatchElements(Int16[] watchElements); 

,並調用它,而不ref

Int16[] someData = new Int16[80]; 
var result = SetWatchElements(someData); 
+0

這有效,但它沒有。我有一個表單應用程序和一個控制檯應用程序都使用相同的DLL。這適用於控制檯應用程序,但窗體應用程序返回了DLL的錯誤響應代碼。我有在窗體文件中定義的dll函數定義。你知道是否有任何原因會導致不同的行爲? – Josh

+0

@Josh確保兩個應用程序具有相同的目標平臺(x86,x64)。 – Dmitry

+0

我做過,他們都是(x86)。表單應用程序被擊中或錯過。有時函數調用有時不會。我試過把這些方法放在後臺線程中,但結果相同。 C++ dll用於與串行接口進行通信,所以我不知道是否有與同步到串行接口的窗體有關的問題或什麼。 – Josh