C++ MFC应用程序和共享库

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应用程序的信息。

我有一个应用程序,它似乎是用MFC编写的(process hacker and DependencyWalker show链接到MFC90)

此外,在安装路径中还有一个库(ftd2x)。但是DependencyWalker不会显示库的MFC90链接并显示:

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。谢谢,正如你所说,我已经有了头文件并构建了库,但应用程序不会启动。我会把密码