通过LoadLibrary()

时间:2018-04-18 14:21:00

标签: c++ excel vba debugging

我正在编写一个基于C ++的DLL,它会导出一些函数,让我们说一个简单的例子

__declspec(dllexport) int __stdcall Test()
{
  return 123;
}

然后,我通过VBA将此DLL加载到正在运行的Excel进程中,并调用其Test函数:

Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
Private Declare Function Test Lib "MyLibrary.dll" () As Long

Sub executeTest()
  LoadLibrary "Path\To\MyLibrary.dll"
  Dim result As Long: result = Test()
End Sub

这很好用。但我似乎无法调试它的C ++部分。

我尝试启动Excel,然后在执行任何代码(即将DLL加载到Excel中的befoer)之前,将Visual Studio附加到正在运行的Excel进程。 当我设置一个断点时,它是白色的" - aka"此断点目前不会被击中。没有为此文档加载符号"。有道理,因为我的DLL还没有被装入Excel。

然后,我执行VBA代码,它将加载DLL并调用Test函数。但是调试器的状态没有变化,断点仍处于这种状态;它似乎没有意识到库已经加载/能够调试它。

我在那里做错了吗?在这种情况下,有没有办法调试我的DLL调用?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试添加__debugbreak指令。如果dll是在调试中构建的,它应该打开Windows Just in Time调试器。

__declspec(dllexport) int __stdcall Test()
{
  __debugbreak(); 
  return 123;
}

请参阅https://msdn.microsoft.com/en-us//library/f408b4et.aspx