sdk开发dll里//#define DLLDIR _declspec(dllimport)急需在调用dll函数要函数名添加此句?
sdk开发dll里//#define DLLDIR __declspec(dllimport)需要在调用dll函数要函数名添加此句???
------解决方案--------------------
封装的dll里函数前面加聊,那我调用的时候需要加吗??????????
------解决方案--------------------
调用的地方你也要引用到他的申明的头文件啊 说白了 dll里用export申明函数是导出的
你使用的地方的申明肯定就是import申明函数是从dll中导入的 一般的dll头文件都会用宏
来控制 在dll中是导出 在使用中是导入 比如:
#ifdef XXX
#define DLLDIR __declspec(dllexport) // export DLL information
#else
#define DLLDIR __declspec(dllimport) // export DLL information
#endif
然后所有导出的函数前加上 DLLDIR
最后在dll工程里会定义那个 XXX 这样 编dll的时候就是导出的申明
在你使用的工程因为没有定义XXX 所以就是导入的申明
------解决方案--------------------
调用的时候可以不加,加了实际是一种优化,编译器知道是dll的导入函数直接生成到IAT的调用。
如果不加,会链接lib文件中的代码,通过lib导入库的代码跳转到IAT。
SDK dll
#define DLLDIR __declspec(dllimport) // export DLL information
//函数指针的SetBMPCallback使用的回调函数
typedef void ( CALLBACK *BMPCallback)(unsigned long callbackID, BITMAPINFO * info, unsigned char *data, unsigned long size);
int DLLDIR SetBMPCallback(int hd, unsigned long callbackID, BMPCallback callback);
调用dll时,
//回调函数
void CALLBACK mybmpCallback(unsigned long callbackID, BITMAPINFO * info, unsigned char *data, unsigned long size)
{
BITMAPFILEHEADER bfh = {0};
bfh.bfType=0x4D42;
bfh.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
bfh.bfSize = bfh.bfOffBits + info->bmiHeader.biSizeImage; FILE *ofile = fopen("image.bmp", "wb");
fwrite(&bfh, sizeof(bfh), 1, ofile);
fwrite(&info->bmiHeader, sizeof(info->bmiHeader), 1, ofile); fwrite(data, 1, info->bmiHeader.biSizeImage, ofile);
fclose(ofile);
}
//自己写回调函数的地址赋值给p(dll里的函数指针类型)
BMPCallback p =mybmpCallback;
//下面是调用SetBMPCallback函数,还有要加 __declspec(dllimport)吗???打断点回调函数mybmpCallback无法调用
typedef int (CALLBACK* PF_SetBMPCallback)(int hd, unsigned long callbackID, BMPCallback callback);
PF_SetBMPCallback SetBMPCallback2 = (PF_SetBMPCallback)GetProcAddress(hh, "SetBMPCallback");
SetBMPCallback2(hd,1,p);
------解决方案--------------------
封装的dll里函数前面加聊,那我调用的时候需要加吗??????????
------解决方案--------------------
调用的地方你也要引用到他的申明的头文件啊 说白了 dll里用export申明函数是导出的
你使用的地方的申明肯定就是import申明函数是从dll中导入的 一般的dll头文件都会用宏
来控制 在dll中是导出 在使用中是导入 比如:
#ifdef XXX
#define DLLDIR __declspec(dllexport) // export DLL information
#else
#define DLLDIR __declspec(dllimport) // export DLL information
#endif
然后所有导出的函数前加上 DLLDIR
最后在dll工程里会定义那个 XXX 这样 编dll的时候就是导出的申明
在你使用的工程因为没有定义XXX 所以就是导入的申明
------解决方案--------------------
调用的时候可以不加,加了实际是一种优化,编译器知道是dll的导入函数直接生成到IAT的调用。
如果不加,会链接lib文件中的代码,通过lib导入库的代码跳转到IAT。