您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页位程序如何调用32位dll(简单解决方案)

位程序如何调用32位dll(简单解决方案)

来源:五一七教育网
位程序如何调用32位dll(简单解决方案)

因为一些原因,我们写位程序时需要调用32位的dll,或者32位程序需要调用位的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

= NULL,

CreateFileMapping(INVALID_HANDLE_VALUE, PAGE_READWRITE, 0, ShareSize, mapFileName);

m_pt

=====第二步

a程序执行函数时发送WM_COPYDATA消息 int param = 10;

=

(PT*)MapViewOfFile(hMapFile,

FILE_MAP_ALL_ACCESS, 0, 0, ShareSize);//

HWND hWnd = ::FindWindow(NULL, PrjName); if (hWnd == NULL) { return; } COPYDATASTRUCT cds; cds.dwData = 0;

cds.lpData = ¶m;//可以是结构体 cds.cbData = sizeof(param); SendMessage(hWnd,

(WPARAM)m_hWnd, (LPARAM)&cds);

======第三步

b程序处理WM_COPYDATA消息 BOOL {

int param = (int)pCopyDataStruct->lpData;

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

return CDialog::OnCopyData(pWnd,pCopyDataStruct); }

======第四步

a程序从共享内存拿到结果 紧跟着HANDLE

SendMessage(hWnd,

(UINT)WM_COPYDATA,

=

(WPARAM)m_hWnd, (LPARAM)&cds);这句之后

hMapFile

OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapFileName);

if (hMapFile == NULL) return NULL;

C**Dlg::OnCopyData(CWnd*

pWnd,

COPYDATASTRUCT* pCopyDataStruct)

(UINT)WM_COPYDATA,

PT *ptr = (PT*)MapViewOfFile(hMapFile,

FILE_MAP_ALL_ACCESS, 0, 0, ShareSize);

CloseHandle(hMapFile);/// 一定要关句柄。。。。

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

经过这个流程下来就实现了调用与程序位数不同的dll 当然这个是单线程的,多线程就得开不同共享内存

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务