VC 加载dll调用函数
求教:MFC工程中,我需要调用shell32.dll函数中的SHCreateDirectoryEx函数创建一个多级目录,而::符号后面所在的函数中找不到SHCreateD...
求教:
MFC工程中,我需要调用 shell32.dll 函数中的 SHCreateDirectoryEx 函数创建一个多级目录,而 ::符号后面所在的函数中找不到 SHCreateDirectoryEx 这个,求教如何在MFC工程中动态添加这个 shell32.dll 并使用其中的函数。
还有我查看进程加载的 dll 中有 shell32.dll 函数,如果程序本身有加载 shell32.dll 函数,是不是可用直接调用 SHCreateDirectoryEx 函数,求调用方式,谢谢赐教 展开
MFC工程中,我需要调用 shell32.dll 函数中的 SHCreateDirectoryEx 函数创建一个多级目录,而 ::符号后面所在的函数中找不到 SHCreateDirectoryEx 这个,求教如何在MFC工程中动态添加这个 shell32.dll 并使用其中的函数。
还有我查看进程加载的 dll 中有 shell32.dll 函数,如果程序本身有加载 shell32.dll 函数,是不是可用直接调用 SHCreateDirectoryEx 函数,求调用方式,谢谢赐教 展开
展开全部
加载调用DLL有两种方法:静态调用和动态调用。
(一).静态调用其步骤如下:
1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;
2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;
3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目录下;
4.打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;
5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然后在Object/library modules输入框中输入:youApp.lib。
6.选择你的目标工程Head Files加入:youApp.h文件;
7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include "youApp.h"
注:youApp是你DLL的工程名。
(二).动态调用其程序如下:
动态调用时只需做静态调用步骤1.
{
HINSTANCE hDllInst = LoadLibrary("youApp.DLL");
if(hDllInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC youFuntionNameAlias = NULL; // youFuntionNameAlias 函数别名
youFuntionNameAlias = (MYFUNC)GetProcAddress
(hDllInst,"youFuntionName");
// youFuntionName 在DLL中声明的函数名
if(youFuntionNameAlias)
{
youFuntionNameAlias(param1,param2);
}
FreeLibrary(hDllInst);
}
}
(一).静态调用其步骤如下:
1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;
2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;
3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目录下;
4.打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;
5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然后在Object/library modules输入框中输入:youApp.lib。
6.选择你的目标工程Head Files加入:youApp.h文件;
7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include "youApp.h"
注:youApp是你DLL的工程名。
(二).动态调用其程序如下:
动态调用时只需做静态调用步骤1.
{
HINSTANCE hDllInst = LoadLibrary("youApp.DLL");
if(hDllInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC youFuntionNameAlias = NULL; // youFuntionNameAlias 函数别名
youFuntionNameAlias = (MYFUNC)GetProcAddress
(hDllInst,"youFuntionName");
// youFuntionName 在DLL中声明的函数名
if(youFuntionNameAlias)
{
youFuntionNameAlias(param1,param2);
}
FreeLibrary(hDllInst);
}
}
展开全部
楼上的是一种方案,还可以在你的工程里加入以下语句,这时::作用域符就可以访问得到了。
#include <ShellAPI.h>
#pragma comment(lib, "shell32.lib")
如果是VC6按以下操作
打开工具栏Project->Setting.s..
出现配置窗口
选择C/C++
Category选择Preprocessor
在Additional include directories
添加C:\PROGRAM FILES\MICROSOFT PLATFORM SDK\INCLUDE
设置完成后
在程序中添加引入库
#pragma comment(lib, "C:\\Program Files\\Microsoft Platform SDK\\Lib\\shell32.lib")
这样应该可以成功完成编译了。
#include <ShellAPI.h>
#pragma comment(lib, "shell32.lib")
如果是VC6按以下操作
打开工具栏Project->Setting.s..
出现配置窗口
选择C/C++
Category选择Preprocessor
在Additional include directories
添加C:\PROGRAM FILES\MICROSOFT PLATFORM SDK\INCLUDE
设置完成后
在程序中添加引入库
#pragma comment(lib, "C:\\Program Files\\Microsoft Platform SDK\\Lib\\shell32.lib")
这样应该可以成功完成编译了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
动态加载,1、创建函数指针
2、加载DLL文件HINSTANCE hins=LoadLibrary(" shell32.dlll")
3、得到函数地址GetProcAddress
4、就可以使用该函数了(用函数指针)
5、FreeLibrary(hins)结束
2、加载DLL文件HINSTANCE hins=LoadLibrary(" shell32.dlll")
3、得到函数地址GetProcAddress
4、就可以使用该函数了(用函数指针)
5、FreeLibrary(hins)结束
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//声明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);
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);
更多追问追答
追问
我喜欢这种方法,但麻烦给个 SHCreateDirectoryEx 的例子好吗? 我按你的方法做相应的修改后出现8处错误,再三改正下还出现1处错误,不懂怎么回事,小弟刚学不久,谢谢。
追答
#include
#include
using namespace std;
int main()
{
//参数传入自己的参数就可以了
HWND hwnd;
LPCTSTR pszPath;
SECURITY_ATTRIBUTES *psa;
//声明DLL函数
typedef int (*pFunc)( HWND , LPCTSTR , SECURITY_ATTRIBUTES *);
//声明函数句柄
pFunc myProc=NULL;
//加载DLL
HINSTANCE hins=LoadLibrary("shell32.dlll");
myProc=(pFunc)GetProcAddress((HMODULE)hins,(LPCTSTR)"SHCreateDirectoryEx ");
//使用
myProc( hwnd, pszPath, psa);
return 0;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你在使用的这个类中添加
HINSTANCE hInst;
hInst=LoadLibrary("Dll3.dll");
兄弟你添加这个这样试试看
HINSTANCE hInst;
hInst=LoadLibrary("Dll3.dll");
兄弟你添加这个这样试试看
参考资料: 孙鑫第19章
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询