win32 dll 的编写
在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。
//----testdll.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
//----testdll.cpp
#include "test.h"
#include <Windows.h>
int WINAPI DllMain(HINSTANCE hin,DWORD fdwReason,PVOID pvReserved)
{
return TRUE;
}
//用到头文件里的宏定义 EXPORT
EXPORT int _stdcall add(int i,int j)
{
return i+j;
}
/*此函数通过DEF文件导出,不会发生名字改编*/
int add1(int a,int b)
{
return a+b;
}
/*此函数通过DEF文件导出,不会发生名字改编
此函数的调用方式为_stdcall
*/
int __stdcall add2(int a,int b)
{
return a+b;
}
/*此函数通过关键字__declspec(dllexport)导出,会发生函数名的变化*/
__declspec(dllexport) int add3(int a,int b)
{
return a+b;
}
/*此函数通过关键字__declspec(dllexport)导出,但由于使用了
extern "C",所以不会发生函数名的变化*/
extern "C" __declspec(dllexport) int add4(int a,int b)
{
return a+b;
}
但是函数的调用方式改为了__stdcall,所以还是会发生函数名改编*/
extern "C" __declspec(dllexport) int __stdcall add5(int a,int b)
{
return a+b;
}
testdll.def文件:
LIBRARY testdll
EXPORTS
add1
add2
可以只有testdll.cpp文件,也可以添加上testdll.h或者testdll.def文件,视不同需要而定。
调用方法:
|
void CDllTestDlg::OnAdd1() HINSTANCE hInst=::LoadLibrary("Dll2.dll"); ::FreeLibrary(hInst); 第2个导出函数的调用: 第3个导出函数的调用: |
以上是动态加载dll. 以下是静态加载的方法:
|
/*------------------声明导入函数的方法----------------*/ /* 方法二:通过关键字__declspec(dllimport)这种方法能够编译出效率更高的代码 方法三:直接包含dll的头文件 */ |
void CDllTestDlg::OnAdd()
{
CString str;
str.Format("1+2=%d",add(1,2));
MessageBox(str);
}
浙公网安备 33010602011771号