嘗試在 CPP 中創建 DLL 并在 Excel 中使用它時遇到以下問題。當引數到達 CPP 函式時,它保存的值會發生變化(無論它在 Excel 中是什么)。我猜它在某個地方“掉落”,但我一直無法弄清楚。
這是代碼:
源檔案
extern "C" double __stdcall my_double(double A)
{
return 2.0 * A;
}
源檔案
LIBRARY
EXPORTS
my_double
VBA 代碼
Declare PtrSafe Function my_double Lib "C:\MyDir\Example.dll" (ByVal A As Double) As Double
然后當我my_double從 excel呼叫時,它總是回傳 0.0。
我在函式上附加了一個除錯點,當它到達 cpp 函式時,我可以看到該值確實為 0。任何有關如何除錯此問題的提示將不勝感激!
到目前為止我嘗試過但沒有成功的事情:
- 確保 excel 上的位和 CPP 中的構建匹配(均為 x64)。
- 嘗試使用發布模式和除錯模式。
- 嘗試使用 和更改 VBA 代碼
ByVal,ByRef但兩者都不使用。 - 嘗試了一個更簡單的例子,使用
int而不是double。 - 我檢查
DUMPBIN了我創建的 DLL 檔案,它看起來不錯。 - 我正在關注本教程:https : //personalpages.manchester.ac.uk/staff/Andrew.Hazel/EXCEL_C .pdf(第 54 頁)
uj5u.com熱心網友回復:
Excel 將難以使用直接從 dll 入口點宣告的函式,因為它不知道引數的型別(以及其他事情,例如如何管理回傳值的記憶體)。教程中的 OP 方法可能在過去有效,但似乎不再有效。
創建 VBA 用戶定義函式 (UDF) 包裝器可以解決這個問題,因為 Excel 知道在這種情況下如何處理和編組引數:
Private Declare PtrSafe Function my_double Lib "C:\Users\david\source\repos\CppTests\x64\Release\DllForExcel.dll" (ByVal A As Double) As Double
Public Function MyDouble(d As Double) As Double
MyDouble = my_double(d)
End Function
使用MyDouble()電子表格中的函式。
另一種解決方案是沿著創建已編譯 Xll(通常使用 Excel SDK)的路線走下去,它具有注冊函式及其引數的入口點,以及管理記憶體分配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/337313.html
