如何调试COM DLL

时间:2018-08-24 01:34:39

标签: c++ visual-studio dll

我对COM DLL中的函数进行了更改。我一直无法弄清楚如何调试所做的更改。

背景:

我最近继承了Visual Studio 2012 C ++项目,该项目可以追溯到 年份。我正在运行Win7 Professional 64位。

项目的顶层设计是这样的:

  • 完成大部分工作的代码都封装在COM DLL中。

  • 每个DLL都有一个单独的包装函数,该函数调用:

    (1) CoInitialize
    (2) CoCreateInstance
    (3) CoUninitialize
    
  • 有一个主程序,显示一个对话框,允许用户选择一个选项。根据选定的选项,主程序将调用相应的包装器函数,然后在相应的COM DLL中运行代码。

问题详细信息:

(1)我无法单步执行Visual Studio调试器中的代码。 (尝试在调试器中运行会产生错误“无法启动程序 “,其中命名的DLL与修改后的DLL不同。)

(2)我将“ fprintf(stderr,...)”调用放入经过修改的DLL代码中,但没有从“ fprintf”调用中获得任何输出。 (我确实看到了我添加到调用DLL的包装函数的“ fprintf”调用的输出。)

我还尝试使用“ fopen”打开一个临时调试文件,将调试语句写入该文件,然后进行fflush和fclose。也没有输出。

(3)我注意到一个帖子(Calling fprintf from dynamic library (c++))建议,尽管“ fprintf(stderr,...)”应该可以工作,但最好在主程序中实现对调试功能的回调程序。我试图这样做。

可以编译更改,但是链接器报告了DLL中用于允许主程序使用的函数名称的未定义引用 传递指向回调函数的指针。

我对未定义的引用感到困惑,因为修改后的DLL具有链接器能够解析的不同导出功能。 具体来说:

  • __ declspec(dllexport)void SetLogFunc(LogFunc LogFuncPtr)[新功能。]
  • __ declspec(dllexport)BOOL DoRosSum(SRosSumData * pRosSumData)[现有功能。]

我使用“ ack”实用程序在整个代码库中搜索了该项目, 包括Visual Studio项目文件和二进制文件,寻找 引用“ DoRosSum”,并且找不到任何有引用的地方 到“ DoRosSum”,而不是对“ SetLogFunc”的引用。

(“ SetLogFunc”被“ dumpbin”列为导出函数。)

我还应该提到我恢复了所有更改,除了:

  • COM DLL中的“ SetLogFunc”功能,

  • 主程序中的回调调试功能,

  • 在主程序中对“ SetLogFunc”的调用。

所以我认为我获得调试输出或在VS2012调试器中运行的问题与我最初对DLL代码所做的修改无关。

长帖子的道歉。近年来,我主要从事C#或Linux系统的开发。我没有使用COM DLL的经验,所以我可能是 缺少一些简单的东西。

如果有人对如何进行有任何想法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

第一个问题,

https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-debug-from-a-dll-project?view=vs-2017

我认为您可以检查是否已经完成此操作。通常,如果您没有在项目属性/调试中正确设置命令,则在VC中运行调试器将始终显示以下消息:

无法启动程序'...... \您的DLL'。

由于DLL需要使用可执行文件(.exe)执行。

我注意到您说的错误消息“命名的DLL与修改后的DLL不同”

您的主程序将与多个DLL一起运行吗?我认为您还需要确保将其他DLL(.dll)文件放入主程序应用程序的文件夹中。

对于未定义的参考问题

如果可以在DLL方面进行编译,则表示这里的逻辑还可以。但是,链接器报告未定义的错误,那么将此功能导出到主程序端应该是一些问题。

我想您首先在主程序端检查是否包含正确的头文件。

就像右键单击主程序“转到定义”中的函数名称一样,它将显示头文件。然后,您可以查看头文件是否正确。

然后,您可以检查导出功能是否正确。您需要确保主程序链接到新的已编译目标文件库(.lib)。每次编译DLL项目时,都需要确保主程序链接到新编译的.lib和.dll,并包括新的头文件。

希望这些帮助。