我对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具有链接器能够解析的不同导出功能。 具体来说:
我使用“ ack”实用程序在整个代码库中搜索了该项目, 包括Visual Studio项目文件和二进制文件,寻找 引用“ DoRosSum”,并且找不到任何有引用的地方 到“ DoRosSum”,而不是对“ SetLogFunc”的引用。
(“ SetLogFunc”被“ dumpbin”列为导出函数。)
我还应该提到我恢复了所有更改,除了:
COM DLL中的“ SetLogFunc”功能,
主程序中的回调调试功能,
在主程序中对“ SetLogFunc”的调用。
所以我认为我获得调试输出或在VS2012调试器中运行的问题与我最初对DLL代码所做的修改无关。
长帖子的道歉。近年来,我主要从事C#或Linux系统的开发。我没有使用COM DLL的经验,所以我可能是 缺少一些简单的东西。
如果有人对如何进行有任何想法,我将不胜感激。
答案 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,并包括新的头文件。
希望这些帮助。