您的位置:首页 > 其它

DLL导出变量

2017-01-03 13:53 267 查看
声明为导出变量时,同样有两种方法:

   第一种是用__declspec进行导出声明


#ifndef _DLL_SAMPLE_H


#define _DLL_SAMPLE_H




// 如果定义了C++编译器,那么声明为C链接方式


#ifdef __cplusplus


extern "C" {


#endif




// 通过宏来控制是导入还是导出


#ifdef _DLL_SAMPLE


#define DLL_SAMPLE_API __declspec(dllexport)


#else


#define DLL_SAMPLE_API __declspec(dllimport)


#endif




// 导出/导入变量声明


DLL_SAMPLE_API extern int DLLData;




#undef DLL_SAMPLE_API




#ifdef __cplusplus


}


#endif




#endif



 

  第二种是用模块定义文件(.def)进行导出声明


LIBRARY DLLSample


DESCRIPTION "my simple DLL"


EXPORTS


        DLLData DATA  ;DATA表示这是数据(变量)

 
   下面是DLL的实现文件


#include "stdafx.h"


#define _DLL_SAMPLE




#ifndef _DLL_SAMPLE_H


#include "DLLSample.h"


#endif




#include "stdio.h"




int DLLData;




//APIENTRY声明DLL函数入口点


BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)


{


 switch (ul_reason_for_call)


 {


  case DLL_PROCESS_ATTACH:


      DLLData = 123;  // 在入口函数中对变量进行初始化


      break


  case DLL_THREAD_ATTACH:


  case DLL_THREAD_DETACH:


  case DLL_PROCESS_DETACH:


   break;


 }


 return TRUE;


}



同样,应用程序调用DLL中的变量也有两种方法。

第一种是隐式链接:


#include <stdio.h>


#include "DLLSample.h"




#pragma comment(lib,"DLLSample.lib")






int main(int argc, char *argv[])


{


 printf("%d ", DLLSample);


 return 0;


}





 

第二种是显式链接:


#include <iostream>


#include <windows.h>




int main()


{


        int my_int;


        HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");




        if (hInstLibrary == NULL)


        {


         FreeLibrary(hInstLibrary);


        }


        my_int = *(int*)GetProcAddress(hInstLibrary, "DLLData");


        if (dllFunc == NULL)


        {


         FreeLibrary(hInstLibrary);


        }


        std::cout<<my_int;


        std::cin.get();


        FreeLibrary(hInstLibrary);


        return(1);


}



 

通过GetProcAddress取出的函数或者变量都是地址,因此,需要解引用并且转类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: