当前位置:首页 > 图片 > 时尚娱乐 > 正文
文章正文

mfc动态调用dll

图片 > 时尚娱乐 > :mfc动态调用dll 是由美文导刊网(www.eorder.net.cn)为您精心收集,如果觉得好,请把这篇文章复制到您的博客或告诉您的朋友,以下是mfc动态调用dll 的正文:


一.VC 加载dll调用函数

//声明DLL函数
typedef int  (pFunc)( HWND hwnd,   LPCTSTR pszPath,   SECURITY_ATTRIBUTES *psa   );
//声明函数句柄
pFunc myProc=NULL;
//加载DLL
HINSTANCE hins=AfxLoadLibrary(" shell32.dlll");
myProc=(NEWWINDOWPROC)GetProcAddress((HMODULE)hins,(LPCTSTR)"SHCreateDirectoryEx ");
/花发羔菏薏孤割酞公喀/使用
myProc( hwnd, pszPath, psa);


二.要在VC的MFC中加载一个动态链接库,以调用其中的函数。求高手指导!初级学者,望详细点!

你好。你要调用别的库的话之需要做如下两件事情

1:添加include 路径
Project->Settings->C++ ->Preprocessor
在 additional include directory 中添加你要加载的库的对应include文件夹 的路径

2:添加lib路径
Project->Settings->Link
在General 中 object library modules 中填写 你要加载的库的 对应 .lib文件名<弗憨缔窖郫忌惦媳定颅br />
在INPUT中 object library modules 中填写 你要加载的库的 对应 .lib文件名
additional library path 填写对应的库的路径

当然,你的库对应的.lib文件 和 .dll 文件要在同一个目录下。
多谢采纳。 (mfc动态调用dll)


三.如何调用MFC dll 来显示其中的对话框

一、dll部分
同过VS向导建立一个MFC dll工程,在工程中创建自己的MFC类,来实现将要展示的界面。新建一个cpp工程,添加头文件#include "StdAfx.h"和界面类的头文件,然后使用下面语句来导出

extern "C" __declspec(dllexport) void ShowDlg(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CXXDlg dlg;
dlg.DoModal();//实现DLL资源切换的?AFX_MANAGE_STATE(AfxGetStaticModuleState());
}

其中CXXDlg是界面类,必须添加代码AFX_MANAGE_STATE(AfxGetStaticModuleState());
作用:用于模块切换时的状态保护,

1.AfxGe长顶拜雇之概瓣谁抱京tStaticModuleState()指向当前模块状态;

2.当前函数调用结束后原模块的状态自动被恢复;

3.用于DLL中所调用MFC函数、类、资源时的模块状态切换;

也就是说,并不是每一个dll的输出函数前都要调用它,只有在要输出对话框等用到资源时要调用!

dll中资源是共享的用了这个函数的防止不同的进程修改资源产生错误!

缺省情况下MFC使用主应用程序的资源句柄来载入资源模板,而DLL中的资源模板是存在于DLL模板中,因此要使用这一语句切换到

二、调用dll

采用如下代码调用dll并显示界面

typedef void (*lpFun)(void);
HINSTANCE hDll;
hDll=LoadLibrary(L"XX.dll");
if(NULL==hDll)
{
MessageBox(L"加载失败");
}
lpFun addFun;
lpFun pShowDlg=(lpFun)GetProcAddress(hDll,"ShowDlg");
if(pShowDlg==NULL)
{
MessageBox(L"加载失败");
}
pShowDlg();

CloseHandle(hDll);
其中XX.dll为dll的名称



四.MFC中调用外部动态链接库的内容,动态链接库dll文件放在哪儿。10分 (mfc动态调用dll)

你在问题补充里面说的非常正确你需要通过改变工作目录(workpath)来使得你的碃骸百缴知剂版烯保楼DLL能够正确的加载别人的DLL,我也遇到过这个问题根据你说的情况,你应该这样1用GetCurrentDir保存当前的工作目录2用SetCurrentDir将当前的工作目录,设置为你的DLL所在的路径,需要使用绝对路径3用LoadLibrary你的DLL4使用SetCurrentDir恢复到原来的工作路径


五.mfc动态调用dll

考虑如下:1该dll有没有放在当前目录下面;2用vc6.0的工具depen涪础帝飞郜读佃嫂顶讥dencies查看函数名是否正确


六.如何在MFC中使用动态链接库

1.隐式链接加载动态链接库
如果有XXX.h ,XXX.lib,XXX.dll,这样就可以隐式链接加载了。
在所要引用的.cpp文件中加入
#include“XXX.h” //包含静态链接库的头文件
#pragma comment(lib,"XXX") //隐式调用库文件
这样就可以使用dll中封装的函数了。
其中语句“#pragma comment(lib,"XXX")”可以用工程设置对话框的设置来代替。
2.动态加载动态链接库
如果只有XXX.dll,只能动态加载,主要通过LoadLibrary和GetProcAddress两个函数来实现。
举个小例子:int ires;typ弗尝缔妒郫德惦泉定沪edef int (_cdecl *MyFunc)(int,int);
HMODULE hModule = ::LoadLibrary("MyDynamicLib.dll"); //加载动态链接库 此提供函数GetMaxCommDiv(int,int)计算最大公约数
MyFinc GetValue = (MyFunc)GetProcAddress(hModule,"GetMaxCommDiv");


七.QT程序调用MFC的动态链接库DLL

这个很难了,因为MFC有自己的初始化,这个一般是在程序启动的时候完成的;而qt有自己的初始化,如果你强行加入M肠罚斑核职姑办太暴咖FC的初始化,应该也可以,但是麻烦而且丑陋.

建议你把Analyse模块的逻辑抽出来,生出独立的,不依赖于界面(无论是MFC还是QT)的纯C++代码,然后以QT为界面实现原来的逻辑,最后再跟GASOOH结合起来.


八.VS2010的MFC程序如何调用动态库文件(dll文件)?放在system32中仍然编译无法打开d(mfc动态调用dll)

dll这个东西,只要放到编译时会去访问的任意路径上即可。
比如你现在是Debug,你可以放到Debug文件夹或者工程文件夹;
你现在是Release, 你可以放到Release文件夹或者工程文件放到System32无法访问可能说明你的程序根本不需要去访问System32,虽然这不太可能。
当然我可以认为楼主是在隐式调用dll, 显示调用失败系统不会报错。如果 你是要隐式调用已经知道库在何处和其中函数定义的dll,可以在你的FingerMatch.cpp开始的时候写上:
#ifdef _DEBUG
#pragma comment(lib, "讥弧罐旧忒搅闺些酣氓..(路径)fp.lib")
#else
#pragma comment(lib, "..(路径)fp.lib")
#endif
然后包含一下fp.h,这个应该是已经做了。那应该不会有什么问题了。
值得注意的是编译时dll只会打开一次,比如你在Debug文件夹下有一个fp.dll,在工程文件夹下也有一个fp.dll,那么编译时使用的是Debug文件夹下的dll,因为它先被找到。

如果上面说的都没用,那么你显式调用吧 (mfc动态调用dll)


九.利用“MFC DLL 向导”创建动态链接库,实现一维数组最大值的求解。并在对话框应用程序中对其调用。

1、创建Win32Dll文件(假定DLL工程文件名为:maxdll),新建CPP文件,输入如下代码:
_declspec(dllexport) float darray(float* inArr, int nCount)
{
float dRes =inArr[0];
for (int i=1; i<nCount; i++)
{
if(dRes<inArr[i]) dRes=inArr[i];
}
return dRes;
}
然后编译生成maxdll.lib、maxdll.dll

2、新建基于对话框的MFC工程,将maxdll.lib、maxdll.dll复制到工程所在的文件夹内,选择“Project\Setting”菜单命名,选择Lin害乏愤何莅蛊缝坍俯开k选项卡,在“Object/library modules”选项编辑框中输入:maxdll.lib

在对话框中加入命令按钮,双击按钮,输入如下命令代码:
float a[10]={1.2,3.1,2.3,6.5,1.9,1.0,6.7,3.4,2.1,4.3};
CString s;
s.Format("%f",darray(a,10));
MessageBox(s);

另外在CPP文件的最前面输入:
extern float darray(float* inArr, int nCount);

运行后点击按钮即可调用dll求数组最大值。

mfc动态调用dll 由美文导刊网(www.eorder.net.cn)收集整理,转载请注明出处!原文地址http://www.eorder.net.cn/pic60194/

文章评论
Copyright © 2006 - 2016 www.eorder.net.cn All Rights Reserved
美文导刊网 版权所有