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

来源:互联网 发布:JS删除disabled 编辑:程序博客网 时间:2024/04/29 08:26

     在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);

原创粉丝点击