C++ 调试C++;通过LoadLibrary()将DLL加载到Excel中

C++ 调试C++;通过LoadLibrary()将DLL加载到Excel中,c++,excel,vba,debugging,C++,Excel,Vba,Debugging,我正在编写一个基于C++的DLL,它可以导出一些函数,比如说在一个简单的例子中 __declspec(dllexport) int __stdcall Test() { return 123; } 然后,我通过VBA将此DLL加载到正在运行的Excel进程中,并调用其测试函数: Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As St

我正在编写一个基于C++的DLL,它可以导出一些函数,比如说在一个简单的例子中

__declspec(dllexport) int __stdcall Test()
{
  return 123;
}
然后,我通过VBA将此DLL加载到正在运行的Excel进程中,并调用其测试函数:

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之前),将Visual Studio附加到正在运行的Excel进程。 当我设置一个断点时,它是“白色”-也就是“这个断点当前不会被命中。没有为此文档加载任何符号”。这是有道理的,因为我的DLL还没有被加载到Excel中

然后,我执行VBA代码,它将加载DLL并调用测试函数。但调试器的状态不变,断点仍保持此状态;它似乎从未意识到库已经加载/能够调试它

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


谢谢

您可以尝试添加一个_debugbreak指令。如果dll是内置调试的,它应该打开Windows实时调试器

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

参见

如果在VBE中添加DLL(通过工具/引用)添加一个实际引用,它是否工作?在通过工具/引用添加引用时,似乎是相同的问题。我不熟悉C++,但是是否有对该库的COM注册?入口点将有一个特定的GUID,您应该能够在注册表中的
HKCR/CLSID/{GUID}
下找到它-该项将有一个
InprocServer32
子项,其中
CodeBase
路径指向DLL位置-它在那里并指向构建路径吗?它确实是一个ATL COM项目;我仍然有点被COM注册搞得不知所措-由于缺乏管理员权限,它无法在机器级别注册(事实上,没有一个GUI在HKCR/CLSID下)。在任何其他注册表树中,在用户级注册方面会有类似的情况吗?我不是100%确定,但对于我自己的附带项目(VBE的COM加载项,用C#编写),我必须以管理员身份运行VS,以获得正确注册的生成。如果在打开VBE的同时保留对DLL的早期绑定引用,您仍然可以成功构建DLL吗?如果是这样,您不知何故没有从生成位置加载DLL-VS在使用DLL时不应该能够覆盖DLL。