concentrate on c/c++ related technology

plan,refactor,daily-build, self-discipline,

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  37 Posts :: 1 Stories :: 12 Comments :: 0 Trackbacks

常用链接

留言簿(9)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

今天第一次写DLL

DLL里面有三种类型,win32 DLL, 标准MFC DLL,以及非标准MFC DLL

他们的区别是,win32 DLL里面主要是用C/C++编写的,不能调用MFC里面的函数之类的。

而标准MFC DLL里面可以使用MFC,但是却不能输出。

非标准MFC DLL里面可以使用MFC,并且可以输出。

下面是一个简单的例子

头文件

#pragma once

 

#ifdef DLLUSAGE_EXPORTS

     #define SIMPLE_API __declspec(dllexport)

#else

     #define SIMPLE_API __declspec(dllimport)

#endif

 

SIMPLE_API int AddTwoNumbers(int lhs, int rhs);

 

实现文件

SIMPLE_API int AddTwoNumbers(int lhs, int rhs)

{

Return lhs + rhs;

}

 

在生成 my.DLL 以后,再用

typedef int (*ADD)(int,int);

HINSTANCE instance = LoadLibrary("E:\\dllusage.dll");

if ( NULL == instance)

{

         MessageBox(NULL,"加载DLL错误",NULL,MB_OK);

         return 1;    

}

ADD myadd = (ADD)GetProcAddress(instance,TEXT("?AddTwoNumbers@@YAHHH@Z"));

if (NULL == myadd)

{

         MessageBox(NULL, "获取函数地址错误",NULL,MB_OK);

         return 2;

}

int result = myadd(5, 6);

 

这里值得说明的一点是:

在第二个参数里面采用的是AddTwoNumbersDLL里面的名称?AddTwoNumbers@@YAHHH@Z,相当于是DLL里面提供给我们调用的接口,如果不采用这样的写法,就会出现127错误

ERROR_PROC_NOT_FOUND

The specified procedure could not be found

因此我使用那种比较笨的办法,用view denpends来查找到AddTwoNumbersDLL里面的入口地址,然后再去调用这个这个入口地址。

或者是采用这样的方法:

Extern c

{

     SIMPLE_API int AddTwoNumbers(int lhs, int rhs);

}

这样一来的好处就是:

ADD myadd = (ADD)GetProcAddress(instance,TEXT("AddTwoNumbers "));

你会发现这样看起来要舒服一点,这个时候,你用view depends来查看DLL中该函数对应的地址,就会发现变成了AddTwoNumbers

posted on 2008-04-02 16:23 jolley 阅读(306) 评论(1)  编辑 收藏 引用

Feedback

# re: 零食之DLL(一) 2008-05-03 07:08 jolley
值得指出的是,在#ifdef DLLUSAGE_EXPORTS上面要跟DLL生成的名称一致.不然可能会造成生成的DLL里面并没有我们所期待的DLL,然后这又是造成GetLastError错误代码为127的一个原因.  回复  更多评论
  


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