菜鸟笔记
提升您的技术认知

64位程序如何调用32位dll(简单ag真人游戏的解决方案 )-ag真人游戏

因为一些原因,我们写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 = ¶m;//可以是结构体
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

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

网站地图