程序中显示与隐示的调用 dll

//===================================
//MyAlg.h
//===================================
/*
隐示装载的dll

从dll中导出一个类,  使用这个dll中类的可执行代码工程必须和这个dll工程用的是同一编译器
否则这个dll将不可用
*/

class CMyAlg
{
public:
 __declspec(dllimport) int Add(int a, int b);
};


//===================================
//MyAlg.cpp
//===================================
#include "MyAlg.h"
int CMyAlg::Add(int a, int b)
{
 return (a + b);
}





//===================================
//alg.h
//===================================

/*
显示装载的dll

从dll中导出一人函数和一个变量, 这个不会出现像导出类所碰到的问题, 要以C
风格的型式导出
*/
extern "C" __declspec(dllimport) int Add(int a, int b);
extern "C" __declspec(dllimport) int g_nValue;







//===================================
//test.cpp  测试前面写好的dll
//===================================

#include <stdio.h>

#define   EXPLICIT_LOAD

#ifdef EXPLICIT_LOAD //定义了显示方法加载DLL
#include <windows.h>
#endif

#ifdef IMPLICIT_LOAD //定义了隐示方法加载DLL
#include "MyAlg.h"
#include "alg.h"
#pragma comment(lib, "Class.lib") //dll中导出一个类
#pragma comment(lib, "Win32Dll.lib")//dll中导出一个函数和变量
#endif


void main(void)
{
#ifdef IMPLICIT_LOAD
//使用隐示方法加载DLL,可以调用dll中导出的函数、变量和类
 CMyAlg alg;
 printf("使用隐示方法加载DLL\n");
 printf("CMyAlg::Add(%d, %d) = %d, \n", 1, 2, alg.Add(1, + 2));
 printf("Add(%d, %d) = %d, g_nValue = %d\n\n", 1, 2, Add(1, 2), g_nValue);
#endif


#ifdef EXPLICIT_LOAD 
//使用显示的方法加载DLL,只能调用dll中以C风格导出的函数
 printf("使用显示的方法加载DLL\n");
 HINSTANCE hIns = LoadLibrary("Win32Dll.dll");
 if(hIns = NULL)
 {
  printf("Load dll failure!\n");
  return;
 }
 
 typedef int(* pAdd)(int, int);
 pAdd pfun = (pAdd)GetProcAddress(hIns, "Add");
 printf("pfun(1, 2) = %d, pfun(1,2)\n");

 FreeLibrary(hIns);
#endif

 getchar();
}

posted on 2006-10-13 08:39 永遇乐 阅读(2136) 评论(0)  编辑 收藏 引用 所属分类: Windows MFC


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(6)

随笔分类

推荐Blog

友情链接

搜索

最新评论

阅读排行榜