如何使用Visual Studiodebugging从VBA调用的C ++ DLL函数

我写了一个C ++的DLL函数,我从VBA(Excel)调用。

我如何设置Visual Studio属性来允许我debugging该函数? 我已经试过指定Excel,但似乎没有工作。

你有两个select:“直接debugging”或“附加”。

我非常喜欢“直接debugging”的方法,因为这里省略了一长串的原因。

在DLL和Excel / VBA这两个方面都需要步骤,如果所有这些步骤都被解决,那么您的发布是不清楚的。

有以下变化:

1)在VS中,根据版本,在“Debug(not release)目标”中inputProject Settings或Project Properties或同等项目,进入Debug或Debugging设置。 :

a)将会有一个名为“Executable for debugging session”或者“command”的字段,或者类似于VS的版本。 在这里,input您的Excel EXE的完整path

b)可选地,如果经常使用相同的“testing电子表格”,请在“命令参数”或“程序参数”或VS版本中inputxls(或其他)的完整path。

您可能需要用双引号括起来(例如,如果path/文件名称中有空格)。

c)还可以将项目的输出设置为“插件有帮助”的Dir,例如名为AddIn的Dir(比较将DLL放在Debug(或Release)Dirs中)

…假定你的DLL有导出函数所需的所有位,项目是DLLtypes的,加上任何DLLEXPORT和编译器指令等等。

… DLLEXPORT设置(以及相关的编译器开关)和调用约定的具体细节将决定许多事情……假定您已经完成了所有正确和一致的事情(尤其是与Excel方面期待的一致)。

…您的DLL可能会或可能不会有一个DLL_Main,如果有的话,需要更多的讨论。

2)在别的之前,一定要为你的DLL创buildExcel端的“接口”,即。 “加载项”。 这可以通过.xla或通过.xll。 我强烈build议.xla路线作为您的第一个方法。

请参阅Excel帮助文件等创build.xla

然后,在您的XLA的VBA模块中,声明您的DLL中的函数/子文件等。 例如,如果您有一个名为Add2_DLL.dll的DLL,其中包含导出的函数“add2_pho_xl”,则:

 Public Declare Function Add2_Pho_XX Lib "E:\EclipseWorkSpace\Add2_DLL\Debug\Add2_DLL.dll" _ Alias "add2_pho_xl" (A As Double, B As Double) As Double 

我在这里使用了Alias方法,原因如下。

在许多情况下,这个声明可以直接作为用户定义函数(UDF)在你的工作表中使用,等等。但是,对于大量的情况,你将需要创build一个VBA“微调”函数/子,创build“终极“UDF,并依靠这个直接inputfunction(见下文)。 这也是一个很长的故事,但是在需要更复杂的事情(数组,变体等)时是必要的。

注意:

a)DLL的完整path是必需的,除非采取了特殊的步骤。 如果您的Addin是为了普遍分发…需要更长时间的讨论。

b)别名必须是DLL中函数的EXACT条目名称。 如果您在DLL(或.Def)文件的末尾附近查看,除非将您的DLL模块设置为“私有”,否则这些文件将显示DLL一侧的条目名称。

在这个例子中,由于Calling Convention和编译器开关的select,条目名称不是“装饰的”,但它可能看起来像

“_add2_pho_xl_ @ 08”等取决于您的select。

无论如何,你必须使用任何DLL。

3)一旦.xla和dll都存在(最好是在同一个目录中),Excel必须被“告知”加载项。 最简单的方法是Excel / Tools / Addins,但有多种“注册”DLL函数的策略。

4)CRUCIALLY,参数列表的属性/声明必须与您的DLL和Calling Convention中的参数列表属性/声明一致。 “问题”的三个(很多可能的)例子是,

(i)VBA端的布尔值为2个字节,如果DLL端的Bool / Logical为1个字节,则debugging将失败,因为双方“无法正确连接”。

(二)弦乐…这可能是一个很长的故事。 这取决于如果发送ByVal或ByRef,它取决于DLL端是否有“隐藏长度”参数等等。记住,VBA使用COM / OLE VBStrings,它们有自己的蠕虫jar。

(三)变体/对象:这些需要一个自己

5)如果以上所有(可能更多)都顺利进行,那么在VS中设置断点(如果需要的话),然后“去”或“启动”debugging(取决于VS版本等)。 这应该启动Excel,如果你还设置了目标xls,它也会启动。 去你join函数的单元格(例如= add2_pho_XX(A1,B1))驻留,然后执行单元格(有时使用“fx”菜单项是有用的,但也有其他方法)。

一些提示:

a)如果函数执行崩溃/挂起等Excel并且甚至没有返回到VS方,那么可能存在一个Arg列表冲突(例如,您将一个Double传递给一个Int或一百万个其他的可能性)或Calling Convention冲突等

b)通常,您可以(在VSdebugging会话期间)同时执行VBAdebugging会话。 也就是说,启动VS bebug之后,如果创build了“spinner”UDF,则将VBA IDE置入,并在VBA UDF中设置中断点。 例如,VBA UDF也依赖于DLL的function。

 Private Function Add2_Pho( FirstNum as Double, SecondNum as Double, Optional lMakeRed as Variant) As Variant ' ' Add2_Pho = Add2_Pho_XX( FirstNum, SecondNum ) ' this is the actual DLL func accessed via Delcare above ' If( IsMissing(lMakeRed) ) Then Else If( cBool(lMakeRed) ) Then If( Add2_Pho < 0 ) Then ' ' ' make the result Red, or something ' End If End If End If ' ' End Function 

…在这里,在第一行设置一个中断点对于查看UDF是否进入VBA端是有帮助的。 如果是的话,点击VBA中的Continue,看看是否进入VS侧,如果没有,再次检查Args,Calling Convention等等

c)如果单元格的内容是#Value或其他一些意想不到的结果,那么至lessUDF被“识别”,但是由于sheet-> VBA问题或VBA-> DLL问题,或者在返回DLL之后无法正常工作 – > VBA

d)经常保存! 并在运行任何操作之前使用VBA IDE的debugging/编译VBA项目,只要确保VBA内部一致。

e)另外,如果你使用的是VBA / XLA,那么得到一个CleanProject的副本(VBA有时会搞乱它的内部,而这个工具将会是一个救命的工具)

请确保debugging模式是主动模式。

如何使用Excel / VBAdebugging您的DLL