1. 关于dll 访问路径问题
先是查system 下是否有DLL ,然后再查当前工程目录 或者用VB 调用时直接使用绝对路径。
2. 关于vb 调用VC DLL 接口问题的阐述
法一:
DLL 导出函数定义
extern "C" double _stdcall GetDistance(LPCSTR strGPS1,LPCSTR strGPS2)
{
函数体
}
说明 :extern "C" 兼容C 语言,_stdcall 用WINAPI 调用规约 适用于VB 其中需要注意的是 关于接口参数字符串类型的兼容性问题,由于VB 采用的WINAPI 的,所以在VC++ 编写DLL 时,对字符型的参数需要用LPCSTR 定义,否则用VB 调用时会出错。
接下来编译 *.def 文件
LIBRARY GpsLocating
EXPORTS
GetDistance
主要作用就是:定义需要导出的函数
Vb 中的调用写法:
Declare + Function( 如果无返回值用sub)+ lib + 路径 + (参数)as + 返回类型。
实例:
Private Declare Function GetDistance Lib "G:/GPS 测距/GPStest(VB)/GpsLocating.dll"(ByVal strGPS1 As String, ByVal strGPS2 As String) As Double
法二:
采用_declspec(dllexport) 方式,并不是和VB 调用,不作细讲。
3. 关于VC++ 加载DLL 的问题
简单做法:只需在link 中填写*.lib ,然后加入此Dll 的头文件,即可
(1). 静态导入
#pragma comment(lib,"*.lib")
extern + 函数;/ 或者 _declspec(dllimport) + 函数
(2). 动态导入
HINSTANCE hDll;
hDll = LoadLibrary("*.dll"); // 动态加载DLL
typedef 函数类型 (*ADDPROC)( 函数参数) ; // 定义函数指针类型
ADDPROC Add = (ADDPROC)GetProcAddress(hDll," 函数名") ;// 获取DLL 导出函数 此时导出函数就是Add 。
FreeLibrary("*dll"); // 释放DLL
例子:在dll1.dll 中有add 函数
HINSTANCE hDll;
hDll = LoadLibrary("Dll1.dll"); // 动态加载DLL
typedef int (*ADDPROC)(int a,int b) ; // 定义函数指针类型
ADDPROC Add = (ADDPROC)GetProcAddress(hDll,"add") ;// 获取DLL 导出函数 此时导出函数就是Add
FreeLibrary("Dll1.dll"); // 释放DLL
两种导入方式的对比:
静态导入:自动加载dll ,自动释放DLL ,不过整个工程都会加载这dll ,会找出内存浪费
动态导入:按照 LoadLibrary+GetProcAddress+FreeLibrary 模式动态加载,灵活,有需要时才加载。