C++ MFC应用程序和共享库
我有一个应用程序,它似乎是用MFC编写的(process hacker and DependencyWalker show链接到MFC90) 此外,在安装路径中还有一个库(ftd2x)。但是DependencyWalker不会显示库的MFC90链接并显示:C++ MFC应用程序和共享库,c++,visual-c++,dll,mfc,C++,Visual C++,Dll,Mfc,我有一个应用程序,它似乎是用MFC编写的(process hacker and DependencyWalker show链接到MFC90) 此外,在安装路径中还有一个库(ftd2x)。但是DependencyWalker不会显示库的MFC90链接并显示: SetupAPI.dll KERNEL32.dll USER32.dll ADVAPI32.dll lib是在什么框架中构建的? 我没有MFC方面的经验。我在它的编译器中没有信息,也没有VC++libs是否可以用来链接MFC应用程序的信息。
SetupAPI.dll
KERNEL32.dll
USER32.dll
ADVAPI32.dll
lib是在什么框架中构建的?
我没有MFC方面的经验。我在它的编译器中没有信息,也没有VC++libs是否可以用来链接MFC应用程序的信息。如果你想记录到dll的调用,最好的方法是编写一个代理dll(dll重定向)。但是对于这一点,您必须知道要覆盖的函数的签名(语法),即参数的确切数量、类型和返回类型等。如果我可以假设您可以以某种方式找到ftd2x.dll中所有函数的签名,那么完成这项工作就很简单了 获取dll函数和序号: 为此,Visual Studio附带了just use dumpbin.exe(通过运行Visual Studio命令提示符使用它) dumpbin.exe/exports{yourpath}\ftd2x.dll>ftd2x.txt 现在,ftd2x.txt具有ftd2x.dll的所有函数名和序号。您甚至可以使用依赖项步行器导出并获取此列表 创建自己的名为ftd2x.dll的dll: 打开Visual Studio,选择VC++>>Win32>>Win32 Project>>Dll(带导出符号选项),最后使用#pragma指令在Dll代码中声明所有导出的原始Dll函数,如下所示
//#pragma comment (linker, "/export:<function>=<origdll_name>.<function>,@<ordinal_number>")
#pragma comment (linker, "/export:FT_Open=ftd2xx_.FT_Open,@1")
#pragma comment (linker, "/export:FT_Close=ftd2xx_.FT_Close,@2")
// :
// :
// :
// delcare all your exported functions here with ordinal number
// :
// :
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
}
Dll代码示例
LIBRARY ftd2xx.dll
EXPORTS
FT_Close = NewFT_Close @2
HINSTANCE hInstance = NULL; // handle to ftd2xx.dll
FARPROC fpFTClose = {NULL}; // function pointer to hold original function address
extern "C" void __stdcall NewFT_Close()
{
// This is our proxy function for FT_Close()
// Do whatever you want to do here and the
// finally call the original FT_Close() using
// the function pointer we got from GetProcAddress()
typedef void (__stdcall *PFTCLOSE)();
PFTCLOSE pFc = (PFTCLOSE)fpFTClose;
if(pFc) pFc();
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
// Load the original dll in to the memory and get the handle
hInstance = LoadLibraryA("ftd2xx_.dll");
if(!hInstance) return FALSE;
// Get the address of the function to be overriden
fpFTClose = GetProcAddress(hInstance,"FT_Close");
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
// Our dll is getting unloaded from the application, unload original as well
FreeLibrary(hInstance);
break;
}
return TRUE;
}
请注意,原始dll在LoadLibraryA()调用中称为ftd2x_uxx.dll。因此,请将原始dll重命名为ftd2x_u2;.dll或根据需要命名它。生成代理dll代码,并将代理dll(ftd2x.dll)带到原始ftd2x.dll所在的路径。现在,您的应用程序将像往常一样调用ftd2x.dll(代理),但ftd2x.dll将在内部调用原始dll ftd2x_u2;.dll
更新#1:
我一直提到,您需要知道要覆盖的函数的签名,幸运的是,我刚刚在linux版本的驱动程序中找到了ftd2x.h文件
从上面的链接下载libftd2x-i386-1.3.6.tgz文件,并将其解压缩到一个文件夹(我使用了7zip),进一步解压缩.tar文件以获得发布文件夹,您将在“release”文件夹中找到ftd2x.h文件。现在,您已经获得了dll的完整函数签名,并且知道如何编写代理dll。祝你好运。ftd2x不是用MFC写的,如果你是这么问的话。你的问题我不太清楚。@Bancila我想写一个FTD2XX的复制品。但我不知道应该在什么框架下编写它?我想创建一个lib,并在ftd2x上替换它,以记录应用程序的函数调用。所以我需要知道我应该在什么框架中这样做,为什么你认为知道TFD2XX内部使用什么框架会在任何方面帮助你?这是一件无关紧要的艺术品。选一个适合你的。这一切归结为从DLL导出符号。我已经创建了代理DLL,但应用程序不会启动,也不会抛出任何错误消息。我需要导出所有函数还是只导出所需的函数?您需要从原始dll导出所有函数。使用dumpbin.exe将所有这些函数放入文本文件,并对所有函数执行#pragma链接,但要覆盖的函数除外。要覆盖的函数将转到DEF文件,如答案中所述。原始dll的编译器版本必须与我的代理dll相同吗?版本不一定相同。。通常地使用有关函数签名的一些信息更新了答案。请检查更新#1。谢谢,正如你所说,我已经有了头文件并构建了库,但应用程序不会启动。我会把密码