编写DLL文件时在DEF文件中定义了 输出函数为什么编译时总不能通过,怎么定义才是正确的?
编写.DLL文件时在DEF文件中定义了 输出函数为什么编译时总不能通过,怎么定义才是正确的?
1.不用.DEF时在. CPP中输出函数声明为:extern "C" __declspec(dllexport) __stdcall BOOL del();
用了.DEF在.CPP中函数该怎么声明?在.DEF中怎么声明输出函数和变量?
2.在.CPP定义了数据共享段
#pragma data_seg("mydata")
HINSTANCE hin=NULL;
#pragma data_seg
在.DEF中
LIBRARY "Project1.dll"
SECTIONS
mydata READ WRITE SHARED
为什么调试时总是报:[Linker Error] Section mydata defined in .def file is empty
[解决办法]
//---------------------------------------// 在DLL中的工程中,假设为MouseHook.bpr(产生MouseHook.DLL)// 1.在Unit1.cpp的最前面(#include <windows.h>之前)加上// #pragma option -zRSHSEG // 改变缺省数据段名// #pragma option -zTSHCLASS // 改变缺省数据类名// 2.新建一工程同名的纯文本文件MouseHook.def,其内容只要// 一行:// SEGMENTS SHSEG CLASS 'SHCLASS' SHARED// 并将此文件用Project->Add Project增加到工程中;// 3.在你的程序代码的前面定义的全局变量都将是DLL共享的,// 在Unit1.cpp中,例如:// 下面的程序将产生有三个导出函数的MouseHook.DLL// 纯文本文件 MouseHook.def的内容如下:// SEGMENTS SHSEG CLASS 'SHCLASS' SHARED#pragma option -zRSHSEG // 改变缺省数据段名#pragma option -zTSHCLASS // 改变缺省数据类名#include <windows.h>//---------------------------------------#pragma argsused// 以下都将是共享区内存变量POINT MouseLoc={0,0}; // 存放鼠标位置HHOOK NewHook=NULL; // 存放新钩子句柄int LoadCount=0; // DLL装入次数计数HINSTANCE DllHinst=NULL;HWND g_hWnd=NULL;char psw[256]={0};int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved){ if(DllHinst==NULL) DllHinst=hinst; if(reason==DLL_PROCESS_ATTACH) // DLL入口 LoadCount+=1; // 装入计数 else if(reason==DLL_PROCESS_DETACH) // DLL出口处理 LoadCount-=1; return 1;}
[解决办法]
使用了def文件, 不需要extern "C"了, 仅在DLL调用的时候写:
#ifdef __cplusplus
extern "C"
{
#endif
BOOL __stdcall del();
#ifdef __cplusplus
}
#endif
#pragma option -zR[SEGMENT NAME] 用来改变缺省数据段名,共享数据时候使用, 最初来源于Borland社区,在帮助文档中没有介绍