Windows动态库链接库DLL开发及应用
软件版本: VC6.0
操作系统: Windows7
动态库开发:
1.VC6.0环境下新建“Win32 Dynamic-Link Library”工程(工程名为mydll)
2.添加如下代码
#include <stdio.h>
extern "C" _declspec(dllexport) void dprint(void)
{
printf("Hello World.\r\n");
}
3.保存并编译后,会在相关目录下产生mydll.dll和mydll.lib两个文件;
注意事项:
函数声明中一定要包含extern "C"关键字,否则导出后可能不能常使用.
动态库Banner
BOOL WINAPI DllMain( HANDLE hModule,
DWORD reason,
LPVOID lpReserved )
{
if(reason)
{
printf("加载动态库\r\n");
}
else
{
printf("卸载动态库\r\n");
}
return TRUE;
}
该函数在动态库被加载(reason=1)和卸载(reason=0)时自动调用;
动态库应用(方案一 动态调用):
1.新建一个应用工程,例如“Win32 Console Application”
2.将mydll.dll文件复制到工程目录下
3.添加如下代码:
#include <Windows.h>
typedef void(*pfun)(void); //函数指针
int main(int argc, char* argv[])
{
HINSTANCE hDLL;
pfun dp;
hDLL=LoadLibrary("mydll.dll"); //加载 DLL文件
if(hDLL == NULL)
{
//加载动态库失败
return -1;
}
dp = (pfun)GetProcAddress(hDLL,"dprint"); //取DLL中的函数地址
if(dp != NULL)
{
dp();
}
}
4.将mydll.dll文件复制至可执行文件目录下即可
注意事项:
一定要加入Windows.h头文件
方法一适用于VC6.0和BCB
动态库应用(方案二 静态调用):
1.新建一个应用工程
2.将mydll.dll和mydll.lib文件复制到工程目录下(重要)
#pragma comment(lib, "mydll.lib")
extern "C" _declspec(dllimport) void dprint(void); //导出
int main(int argc, char* argv[])
{
dprint();
}
注意事项:
1.如果不指定extern "C" 可能会造成编译错误;
2.可以将导出函数定义在mydll.h文件中;
3.进行静态调用,编译时需要提供lib文件(BCB需对lib文件进行转换);
转换命令:coff2omf -lib:ms usbrd32_win.lib bcb usbrd32_bcb.lib
4.即使静态调用,运行时依然需依赖于dll文件;
基于C#的动态库调用
//引用头文件
using System.Runtime.InteropServices;
//导入函数
[DllImport("mydll.dll",
EntryPoint = "GetDllVersion",
CallingConvention = CallingConvention.StdCall)]
public static extern String GetDllVersion();
//应用
GetDllVersion();
注意事项:
1.导出函数第一个参数是动态库名称
2.导出函数必须用static extern关键字修饰;