首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

编写DLL文件时在DEF文件中定义了 输出函数为什么编译时总不能通过,如何定义才是正确的

2012-05-11 
编写DLL文件时在DEF文件中定义了 输出函数为什么编译时总不能通过,怎么定义才是正确的?编写.DLL文件时在DE

编写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


[解决办法]

C/C++ code
//---------------------------------------//   在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社区,在帮助文档中没有介绍

热点排行