2011-04-05 39 views
1

我有一個C++方法,它需要一個double類型的參數,例如如何將一個double值傳遞給使用DLLImport的C++參數?

extern "C" { 
    __declspec(dllexport) void __cdecl GetResult (double resultLine); 
} 

在C#的一面,我可以調用的方法,但它始終是結果行值轉換爲0。我打電話使用的DllImport的EXTERN功能的C++ DLL方法:

internal static class UnsafeNativeMethods 
{ 
const string _dllLocation = "CoreDLL.dll"; 
[DllImport(_dllLocation)] 
public static extern void GetResult(double resultLine); 
} 

我可以調用其他方法,採取字符串值和一切正常,但由於某種原因,它不起作用,當我通過雙值。

這是傳遞double值的正確方法嗎?還是我需要使用ref/out等?

+0

請從.H文件中顯示確切的C++函數定義,以及C#程序中的整個DLLImport語句。 – 2011-04-05 21:48:53

+0

完成上面,讓我知道如果它不清楚。 – InfoLearner 2011-04-05 21:52:51

+0

很明顯。請參閱下面有關調用約定的答案。如果這不能解決問題,那麼代碼中的其他地方就會出現問題。您需要單步確定您傳遞的值是否爲零。 – 2011-04-05 22:42:08

回答

3

我不是100%確定這是相關的,但我在這裏看到的根本錯誤是你的調用慣例錯誤。如果您未指定任何內容,則DllImport屬性將使用Winapi調用約定,實際上是__stdcall,而您需要__cdecl

要解決這個問題設置CallingConvention領域CallingConvention.Cdecl

internal static class UnsafeNativeMethods 
{ 
const string _dllLocation = "CoreDLL.dll"; 
[DllImport(_dllLocation), CallingConvention=CallingConvention.Cdecl] 
public static extern void GetResult(double resultLine); 
} 

或調用約定設置爲__stdcall在C++側(如果你不需要可變參數__stdcall也有點比__cdecl更有效)。

+0

非常好的樣品! – 2011-04-05 22:03:34

+0

@Preet:謝謝,但它只是應用了更正的OP代碼。 :) – 2011-04-05 22:04:26

2

調用約定不一致,一方是cdecl,另一方是stdcall。讓他們匹配,你應該回來做生意。

相關問題