64位MFC程序,调用32位DLL

举报
福州司马懿 发表于 2023/05/30 16:53:37 2023/05/30
【摘要】 当64位MFC应用程序调用32位DLL时,你可以通过创建一个中间层Wrapper DLL来实现。下面是一个简单的示例,演示如何从64位MFC应用程序调用32位DLL的函数:假设你有一个32位DLL,其中包含一个名为MyFunction的函数,它接受一个整数参数并返回一个整数。你想从64位MFC应用程序中调用这个函数。首先,创建一个新的64位DLL项目(Wrapper DLL),用于与32位D...

当64位MFC应用程序调用32位DLL时,你可以通过创建一个中间层Wrapper DLL来实现。下面是一个简单的示例,演示如何从64位MFC应用程序调用32位DLL的函数:

假设你有一个32位DLL,其中包含一个名为MyFunction的函数,它接受一个整数参数并返回一个整数。你想从64位MFC应用程序中调用这个函数。

首先,创建一个新的64位DLL项目(Wrapper DLL),用于与32位DLL进行交互。在这个64位DLL项目中,编写一个导出函数,该函数将调用32位DLL的函数。

下面是一个简单的例子:

// WrapperDLL.h
#pragma once

#ifdef WRAPPERDLL_EXPORTS
#define WRAPPERDLL_API __declspec(dllexport)
#else
#define WRAPPERDLL_API __declspec(dllimport)
#endif

extern "C" WRAPPERDLL_API int CallMyFunction(int value);
// WrapperDLL.cpp
#include "WrapperDLL.h"
#include "windows.h"

typedef int(*MYFUNCTION)(int);

int CallMyFunction(int value)
{
    HINSTANCE hDLL = LoadLibrary(L"path_to_32bit_dll.dll");
    if (hDLL != NULL)
    {
        MYFUNCTION myFunction = (MYFUNCTION)GetProcAddress(hDLL, "MyFunction");
        if (myFunction != NULL)
        {
            int result = myFunction(value);
            FreeLibrary(hDLL);
            return result;
        }
        FreeLibrary(hDLL);
    }
    return -1;
}

在这个示例中,我们创建了一个名为CallMyFunction的导出函数。该函数加载32位DLL,并使用GetProcAddress函数获取MyFunction函数的地址。然后,我们将参数传递给32位DLL的函数,并返回结果。

接下来,编译这个Wrapper DLL项目,并生成一个64位的DLL文件。

然后,在你的64位MFC应用程序中,你可以通过调用CallMyFunction函数来间接调用32位DLL的函数。例如:

// MFCAppDlg.cpp (64位MFC应用程序的对话框类文件)
#include "WrapperDLL.h"

// ...

void CMFCAppDlg::OnBnClickedButton1()
{
    int result = CallMyFunction(42);
    // 处理结果...
}

这里,我们在MFC应用程序中的按钮单击事件处理程序中调用了CallMyFunction函数,将参数值 42 传递给32位DLL的函数。你可以根据需要使用返回的结果。

需要确保在编译64位MFC应用程序和Wrapper DLL时,使用相应的64位编译器选项。此外,还需要将32位DLL的路径替换为你自己的实际路径。

这只是一个简单的示例,具体的实现可能因实际情况而有所不同。你可能需要根据32位DLL的特定函数和参数来进行更多的调整和适配。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。