【发布时间】:2012-10-19 17:21:17
【问题描述】:
我最近从朋友那里得到的 c++ dll 遇到了一些问题。 我正在尝试将 dll 导入 Excel VBA 加载项。 (我使用的是 Excel 2010 32bit,dll 是在 Visual Studio 2008 中编译的)
首先我尝试导入它,但它失败并出现运行时错误 49。 我得出的结论是,它可能来自缺少的 c++ 声明 (__stdcal)。 (我认为 Visual Studio 应该自动执行此操作,但没关系)
现在我有一个新的 dll,其声明中包含 __stdcal,但方法在其开头使用下划线 (_) 声明。
所以当我尝试声明 Sub 时,Excel 会告诉我“无效字符”之类的信息 是否有可能在不更改 c++ 文件的情况下避免这种情况?
'void _SaveFile(const char *FileName_);'
Declare Sub _SaveFile Lib "D:/DLL/TableController.dll" (ByRef FileName_ As String)
^
|
提前致谢
这里有一些额外的信息可能会导致我的问题的解决方案。
我现在有一些 C++ 代码来调试我的问题... 我仍然收到运行时错误 49,但依赖walker 现在给了我正确的方法名称(我认为这非常棒;))
我尝试在 C# 程序中使用相同的 dll。 正如我所料,它工作得非常正常。 这是我的 C# 代码 这是导入:
[DllImport("JLTable.dll",CallingConvention=CallingConvention.StdCall)]
internal static extern void JLReadFile(string _FileName);
[DllImport("JLTable.dll", CallingConvention = CallingConvention.StdCall)]
internal static extern long JLGetRowCount();
如果我点击一个按钮就会发生这种情况
TableRunner.JLReadFile(@"D:\file.tab");
long rows = TableRunner.JLGetRowCount();
MessageBox.Show(rows.ToString());
这是我在 VBA 中的代码 声明:
Declare Function JLReadFile Lib "D:/JLTable.dll" (ByRef FileName_ As String)
Declare Function JLGetRowCount Lib "D:/JLTable.dll" () As Long
还有电话:
Sub Read()
Dim path As String
path = "D:/file.tab"
JLReadFile (path)
Dim count As Long
count = JLGetRowCount()
End Sub
这也是我要调用的 c++ 代码。 由于某种原因,我的朋友不希望我展示代码的确切作用,但它的行为仍然与此代码相同。
.h 文件(JLTable_API 类似于#define JLTable_API __declspec(dllexport))
#define STDCALL
extern "C"
{
JLTABLE_API void STDCALL JLReadFile(const char *FileName_);
JLTABLE_API void STDCALL JLSaveFile(const char *FileName_);
}
.c++ 文件
void STDCALL JLReadFile(const char *FileName_)
{
//log something to a file
}
long STDCALL JLGetRowCount()
{
//log something to a file
return 0;
}
非常感谢您能给我的每一个提示
和往常一样 提前致谢
【问题讨论】: