2016-03-06 81 views
0

你好,我正在嘗試創建一個簡單的C++ dll來在Excel中使用。在excel中使用C++ dll時沒有考慮到的參數

這裏是我做過什麼:

.cpp文件:

double _stdcall Test(double z) 
{ 
    return z+2.0; 
} 

DEF文件:

LIBRARY 
EXPORTS 
Test 

在Visual Studio: 項目屬性>配置屬性>命令>「 Path/EXCEL.EXE「

配置管理器>平臺> x64

在VBA:

Declare PtrSafe Function Test Lib _ 
"Path\MyDLL" (ByVal z As Double) As Double 

但是,當我打電話測試(2)在Excel中,它返回2,而不是4看起來說法被視爲0送花兒給人(其實如果我產值在調用該函數時在一個文件中,它是2.122e-314)。

任何輸入將不勝感激。

感謝

編輯1: 如果我改變參數和返回值INT與VBA龍,測試(2)返回3

任何人有一個想法,爲什麼參數爲1詮釋?

+0

一切都適合我。您是否記得將模塊定義文件設置爲您的.def文件?這是什麼'項目屬性>配置屬性>命令>「路徑/ EXCEL.EXE」'。我沒有這樣的選擇。 – ly000

+0

如果我不這樣做,我得到以下錯誤: 「路徑/ MyDLL.dll」不是有效的Win32應用程序。 事情是,def文件可能工作正常,因爲函數被調用,只是沒有考慮Excel參數 –

+0

您的C++編譯器不知道該函數正在導出。所以它期望參數傳遞的方式不同,浮點是通過SSE指令完成的,參數通過XMM0寄存器傳遞。然而,Excel假定參數應該以傳統方式通過FPU寄存器ST0。把'__declspec(dllexport)'放在函數前面來解決這個問題。 –

回答

0

道歉:本來張貼這作爲註釋,但還不能:

第一:你的函數可以導出爲C++重整名稱。 使用extern「C」來防止名稱損壞。還有其他方法可以做到這一點,但這是最直接的。但是,如果測試功能被成功調用,我不確定這是否是問題。

使用extern「C」你的C函數看起來像這樣。

extern "C" 
double _stdcall Test(double z) 
{ 
    return z+2.0; 
} 

第二:你是否完全肯定你正在選擇正確的DLL,而不是缺少修正的舊DLL?嘗試將函數名稱更改爲源和Excel VBA封裝器中更具體的內容。

第三:如果您未在64位Excel系統上運行,請在VB中從您的函數規範中刪除PtrSafe聲明並重新編譯爲32位。

第四:不要試圖直接從Excel單元調用您的DLL。將函數包裝在VBA中(下例)或使用CALL函數。

下面的代碼是一個如何包裝寫入VBA單元函數的示例。

Public Function CellFunction_Test(x As Double) As Double 
'' Tells excel to call this function only if the inputs change 
'' and not on every recalculation 
Application.Volatile False 

'' Set an error handler, good practise for more complicated functions you might write later 
On Error GoTo CellFunction_Test_EH: 

'' Call into the DLL 
CellFunction_Test = Test(x) 
Exit Function 

'' Error Handler 
CellFunction_Test_EH: 
CellFunction_Test = "Error - " & Err.Description 
End Function 
+0

您好,非常感謝您加入您的意見,非常感謝。 1.我添加了外部「C」行。沒有改變任何東西。 2.再次嘗試使用新項目,所以我肯定是的,但仍然沒有運氣。 3.我正在運行一個x64 Excel 2013版... 我可以在Excel中調試程序,並且函數確實被調用。但是,就像在Excel調用和C++執行之間清理堆棧一樣。因爲如果按值傳遞,z的值是2e-314,並且如果通過引用傳遞它,則無法讀取內存異常,並在C++函數參數列表中給出地址。 也許這說明了 –

+0

您是直接從Excel單元格調用此函數(例如= TEST(2))還是從VBA函數調用宏函數或其他函數? – JimmyNJ

+0

謝謝大家,第四點爲我解決了!非常感謝你,但我不知道爲什麼...... –