Lv.v

导航

DLL相关注意

Dynamic Library.h

源码如下:

#pragma once
//extern "C" _declspec(dllexport) int _stdcall add(int a=10,int b=10); //利用关键字导出

//extern __declspec(dllexport) int i;
class _declspec(dllexport) DLLTest        //利用关键字导出类
{
public:
int a;
DLLTest();
~DLLTest();
};

Dynamic Library.cpp

源码如下:

#include <windows.h>
#include <iostream.h>
#include "Dynamic Library.h"

int i=200;

extern "C" _declspec(dllexport) int _stdcall add(int a,int b)
{
return a+b;
}

extern "C" _declspec(dllexport) int dec(int a,int b)  
{
return a-b;
}

DLLTest::DLLTest()
{
cout<<"Construct DLLTest Object"<<endl;
}

DLLTest::~DLLTest()
{
cout<<"Destructor"<<endl;
}

DEF文件中源码:

LIBRARY "Dynamic Library"

EXPORTS
i DATA    ;导出全局变量

Link Dynamic.cpp

源码如下:

#include <windows.h>
#include "Dynamic Library.h"    //加载静态DLL  或者 静态调用 需要加载头文件
#include <iostream>
using namespace std;

#pragma comment(lib,"Dynamic Library.lib")  //连接LIB文件

typedef int (_stdcall *lpAdd)(int a,int b);    
typedef int (*lpDec)(int a,int b);

extern _declspec(dllimport) int i; //导入DLL中全局变量
class _declspec(dllimport) DLLTest; //导入DLL中的类

void main()
{
lpAdd addFun;
lpDec decFun;
DLLTest aa;
// cout<<i<<endl;
HINSTANCE hDll=LoadLibrary("Dynamic Library.dll"); //动态加载DLL

addFun=(lpAdd)GetProcAddress(hDll,"_add@8");  //获取函数指针地址
cout<<addFun(1,2)<<endl;             //调用DLL函数

decFun=(lpDec)GetProcAddress(hDll,"dec");
cout<<decFun(3,3)<<endl;
FreeLibrary(hDll);
}

以上为调用动态DLL.

注意: 1.Extern "C" 和_stacall 的含义.(命名方式和调用方式)

    2.隐式调用需要加载DLL文件和LIB文件以及头文件,用关键字 _declspec(dllimport) 可向预编译文件导入DLL中的对象和类.

    3.函数的调用方式要和DLL函数的调用方式一样.

 

posted on 2012-04-27 12:33  Lv.v  阅读(187)  评论(0编辑  收藏  举报