因为一些原因,我们写64位程序时需要调用32位的dll,或者32位程序需要调用64位的dll

项目中我也遇到了这么一个没法回避的问题

看网上有写什么进程外com,没去研究,我用了一个比较简单的方案可以实现

主要就两个方案的结合

1.WM_COPYDATA

2.共享内存

当a程序SendMessage发送WM_COPYDATA 时,b程序执行WM_COPYDATA处理函数,此时a程序阻塞在SendMessage处,只有b程序执行处理函数结束后,a程序才继续执行SendMessage后的语句。这样就可以实现在A程序需要调用dll函数时,通过发送WM_COPYDATA消息,让b程序去调用需要的dll,然后将结果返回到a程序。

WM_COPYDATA消息是传输少量只读数据给其他程序的,所以可以把调用dll所需的参数值传递给b程序。b程序调用dll后如果将结果给a程序呢?这里就可以用共享内存。

b程序开一个共享内存,将结果写入共享内存,当a程序等到b程序 执行完WM_COPYDATA后,通过共享内存就拿到dll函数执行结果。

a程序可以在启动时打开b程序,退出时关闭b程序。b程序在启动时就开一个共享内存(当然,如果dll函数执行结果长度实在没办法用一个足够的缓冲区定义大小,也可以每次执行dll函数时开一个共享内存),并且b程序ShowWindow(SW_HIDE)隐藏掉。

实际的代码流程假设这样

struct PT
{
PT() :x(-1), y(-1) {}
int x;
int y;
};    存储dll函数返回结果的结构体

=======================

一段代码 。。。。

int    param = 10;

PT  pt;

fun(param,   &pt.x,  &pt.y );    这里调用了一个dll中的函数,这个函数进行了很复杂的运算出来个结果

int   y = pt.y* 5...

一段代码。。。。。

=======================

a、b程序公用的定义

#define mapFileName   _T("share")  //共享内存名称
const int ShareSize = sizeof(PT);

#define PrjName      _T("prj")  //b程序窗口名。。由于b程序需要隐藏,在b程序初始化时SetWindowText(PrjName);

PT *m_pt;//b程序程序变量,指向共享内存中数据

=====第一步

b程序启动时开启共享内存

HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, ShareSize, mapFileName);
m_pt = (PT*)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, ShareSize);//

=====第二步

a程序执行函数时发送WM_COPYDATA消息

int    param = 10;

HWND  hWnd = ::FindWindow(NULL, PrjName); 
if (hWnd == NULL) { return; }
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.lpData = &param;//可以是结构体
cds.cbData = sizeof(param);
SendMessage(hWnd, (UINT)WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&cds);

======第三步

b程序处理WM_COPYDATA消息

BOOL C**Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)

{

int param = (int)pCopyDataStruct->lpData;

fun(param,   &m_pt->x,& m_pt->y); //dll中的函数,m_pt已经是共享内存指针,直接进行操作写入共享内存

return CDialog::OnCopyData(pWnd,pCopyDataStruct);

}

======第四步

a程序从共享内存拿到结果

紧跟着SendMessage(hWnd, (UINT)WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&cds);这句之后

HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapFileName);
if (hMapFile == NULL)    return NULL;

PT *ptr = (PT*)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, ShareSize);
CloseHandle(hMapFile);/// 一定要关句柄。。。。

int   y = ptr->y* 5...    对结果进行使用

经过这个流程下来就实现了调用与程序位数不同的dll

当然这个是单线程的,多线程就得开不同共享内存

64位程序如何调用32位dll(简单解决方案 )相关推荐

  1. 64位系统VBS调用32位COM组件

    64位系统VBS调用32位COM组件 标签: 32位, 64位, COM, COM组件, VB, VBS, VBScript 标题: 64位系统VBS调用32位COM组件 作者: Demon 链接:  ...

  2. 64位matlab调用 com组建,64位系统VBS调用32位COM组件

    今天有人问我,为什么他的VBS脚本在64位Windows 7中用VbsEdit可以直接执行,但是直接双击就会出错:ActiveX 部件不能创建对象: 'MSWinsock.Winsock'. 在64位 ...

  3. python 64位程序 打包用于32位系统_python分别打包出32位和64位应用程序

    由于我们分发的python应用可能运行在64位环境,也可能运行在32位环境,所以我们需要为同一套应用代码配置两套打包环境,怎么配置? 步骤如下 1,在电脑上分别下载安装32位和64位的python,安 ...

  4. 64位c语言调用32位glibc,glibc fclose源代码阅读及伪造_IO_FILE利用fclose实现任意地址执行...

    简介 最近学习了一下_IO_FILE的利用,刚好在pwnable.tw上碰到一道相关的题目.拿来做了一下,遇到了一些困难,不过顺利解决了,顺便读了一波相关源码,对_IO_FILE有了更深的理解. 文章 ...

  5. Windows64位环境下注册32位达梦odbc驱动

    64位应用程序只能调用64位odbc驱动:32位程序只能调用32位odbc驱动.位数不匹配会报错"在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配". 方法一:直接安装32 ...

  6. 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考

    最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...

  7. 64位进程调用32位dll的解决方法

    最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...

  8. 64位FME Server 与32位FME Desktop协同处理MDB格式数据

    作者:ZJ 在FME所支持的数据格式中,部分数据格式受限于软件位数,例如常见的GIS数据格式包含SHP(Esri Shapefile).GDB(File Geodatabase).MDB(Person ...

  9. 64位程序调用32位dll

    转自:https://blog.csdn.net/yanmanm/article/details/81870436 https://blog.csdn.net/nie2314550441/articl ...

  10. 64位进程调用32位DLL详解

    64位进程调用32位DLL------探索 相关资料: 微软公司的官方网站针对这个问题描述如下: 在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一 ...

最新文章

  1. 挨踢项目求生法则-战略篇
  2. 360浏览器打不开qq空间_浏览器变慢有救了!只要2秒,重回新安装一样爽快!
  3. 我们从2021谷歌I/O大会给的谜题中发现了隐藏信息
  4. 二叉树两个结点的最低公共父结点 【微软面试100题 第七十五题】
  5. 有关EnableQ在线问卷调查引擎的记者访谈记录
  6. Java开发框架!阿里大牛亲手操刀微服务架构实战
  7. 关于@Import注解的几个问题
  8. React Router V6 新特性
  9. php5.5 pdo mysql_PHP5中PDO的简单使用
  10. [转载] 在python中pop的用法_python中pop()函数如何使用
  11. logback 自定义PatternLayout
  12. n个人有c个魔法帽几天去掉所有的帽子
  13. php 输入经纬度查询位置,根据经纬度查询附近地点信息
  14. Madoko - Markdown 在线编辑器
  15. OpenCV:图片文字分割
  16. 错误:‘Series‘ objects are mutable, thus they cannot be hashed
  17. 南京大学计算机专业拂晓,南京大学2020年计算机学科录取推免生222人,全部来自211高校...
  18. 从“Real如我”来看当前社交APP开发-深圳积木创意科技
  19. 《那些年啊,那些事——一个程序员的奋斗史》——40
  20. gpgpu_GPGPU Java编程

热门文章

  1. shell脚本之安装ansible(centos7环境)
  2. Android 用webService产生java.lang.ClassCastException: org.ksoap2.serialization.SoapPrimitive错误的解决 ....
  3. 编码风格之变量的命名规则
  4. 如何设置GridView的列宽
  5. uni-app uniCloud 前端操作数据库 模糊查询
  6. vue 获取跳转上一页组件信息
  7. node_modules/css-loader?{sourceMap:true}!./node_modules/vue-loader/lib/style-compiler?报错问提解决方案
  8. 小程序的网络请求封装
  9. mysql查询时间段内数据
  10. Python模块的使用