注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

快乐的机器猫 大桥加加网易分站

要有更宽广的视野和胸怀

 
 
 

日志

 
 

在Borland C++ Builder6中写DLL初步入门  

2009-12-23 21:46:43|  分类: 计算机软件学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

     在BORLAND C++ BUILDER6 写DLL初步实验. 虽然简单, 但是基本弄清了点眉目:

主要步骤: 1 写一个DLL   2 写一个APP来调用DLL

 

1. 写一个DLL

FILE->NEW-> DLL WIZARD 选C++ 及VCL 这时根据向导生成了一个DLL框架, 看上去很像一个普通的app,  下面完善并修改代码, 定义自己的一个DLL函数 myindlltest (void):

#pragma argsused
extern "C" __declspec(dllexport) int __stdcall myindlltest(void);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------
int __stdcall myindlltest(void)
{
        return 3;
}

注意在编译时, 还是老样子(俗称"去2勾"): project->options.. 选packages页,去掉勾Build with runtime packages

选linker页, 去掉勾Use Dynamic RTL

这第一步完成了, 我们可以找到类似 project1.libproject1.dll 2个文件, 下一步会用到

 

2 写一个APP来调用DLL

FILE->NEW->APPLICATION 建立一个新工程, 在project manager中,将刚才的project1.lib添加进来. 另外将project1.dll  复制到当前的app目录下, 便于下一步调用.

在窗体上添加一个Edit1, 一个command button,

然后在头文件中加入接口声明,例如:

extern "C" __declspec(dllexport) int __stdcall myindlltest(void);

准备工作完成, 可以调用了.

有两种方式调用: 静态和动态

(1)静态调用方法:

        int i;
        i = myindlltest();
        Edit1->Text = i;

在Edit1框中出现3, 说明我们调用成功

(2) 动态调用方法:

        HINSTANCE dd;
        int __stdcall(*ddd)(void);
        dd = LoadLibrary("Project1.dll");
        ddd = GetProcAddress(dd,"myindlltest");
        Edit1->Text = IntToStr(ddd());
        FreeLibrary(dd);

在Edit1框中出现3, 说明我们调用成功.

图: 在Borland C++ Builder6中写DLL初步入门 - huasoft - 快乐的机器猫 小桥加加网易分站

       讲完了, 虽然很初级, 但是毕竟是一个简单易入门的例子. 一些扩展知识没讲到,比如单就调用方式而言就有__cdecl,  __pascal, __fastcall, __stdcall之分,  为了简化起见我们只用了__stdcall一种方式.

 

 补充:对于动态调用,上面的例子只是适用于导出函数返回值是int 或void,并且参数是0的,至于其它类型,需要进行函数指针类型转换,所以更为通用的写法是(以返回值为char, 参数为char的函数指针为例):

先定义类型

 typedef char __stdcall(*TMyFunction)(char);

  HINSTANCE mylibhandle = LoadLibrary("mysqlite3dll.dll");
  TMyFunction myfunchandle = (TMyFunction)GetProcAddress(mylibhandle,"mydlltest");  //指针转换,很重要
  Edit1->Text = myfunchandle("A");

  FreeLibrary(mylibhandle);

  评论这张
 
阅读(713)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018