怎样在C++ Builder中创建使用DLL

动态链接库(DLL)是Windows编程常遇到的编程方法,下面我就介绍一下在BCB (C++ Builder下简称BCB) 中如何创建使用DLL和一些技巧。

一、创建:

使用BCB File|NEW建立一个新的DLL工程,并保存好文件BCB,生成一个DLL的程序框架。

1.DllEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来指示DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL;

2.在程序中加入自己所要创建的DLL过程、函数;

3.用dllimport描述出口;

例程序如下:

#include
#pragma hdrstop
extern "C" __declspec(dllexport) int test();
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason,void *)
{
return 1;
}
int test()
{
return 3;
}

注意:动态链接库中调用过程、函数时有不同的CALL方式 __cdecl、__pascal, __fastcall、__stdcall,BCB中默认的方式为__cdecl(可不写),如果考虑兼容性可用时__stdcall声明方法为:

extern "C" __declspec(dllexport) int __stdcall test();

对于其中过程、函数也改为:

int __stdcall test()

二、使用DLL

在BCB中使用DLL有两种方法:

1.用静态调用法

首先需要在BCB的项目中加入输入接口库(import library),打开工程项目,使用BCB View|Project Manager打开项目列表,向项目中加入接口库(*.lib)。

其次在头文件中加入接口声明。

例程序如下:

//define in include file
extern "C" __declspec(dllimport) int __cdecl test();
//use function in main program
int I;
I=test();

注意:

(1)动态链接库调用过程、函数时CALL方式 与创建时方式一样不写为__cdecl,其它需要声明。

(2)BCB创建的DLL有对应的输入接口库(import library),如只有DLL而无库时,可用BCB的implib工具产生:implib xxx.lib xxx.dll;另外可用:tlibxxx.lib,xxx.lst 产生DLL的内部函数列表,许多Windows的未公开技术就是用这种方法发现的。

2.动态调用法

动态调用法要用Windows API 中的LoadLibrary()和GetProcAddress()来调入DLL库,指出库中函数位置,这种方法较常见。

例程序如下:

HINSTANCE dd;
int _stdcall (*ddd)(void);
dd=LoadLibrary("xxx.dll");
ddd=GetProcAddress(dd,"test");
Caption=IntToStr(ddd());
FreeLibrary(dd);

三、注意:

创建DLL时编译链接时注意设置Project Options。

Packages标签:去除Builder with runtime packages检查框。

Linker标签:去除Use dynamic RTL检查框。

否则创建的DLL需要Runtime packages or Runtime library。

时间: 2024-09-11 14:59:29

怎样在C++ Builder中创建使用DLL的相关文章

Flare 3D 2.0在Flash Builder中创建一个基于Molehill 3D的项目

需要做的准备如下: 1,Flex SDK Hero 2,Flash Player 11,0,0,58 Incubator 3,playerglobal.swc 4,Flare 3D 2.0 然后按照下面的几步创建项目: 安装Flex SDK Hero 请到这里下载Hero build 19786 配置Flex SDK 将下载后的Hero(版本19786)拷贝到Flash Builder的安装目录中并命名: [Flash Builder安装目录]/sdks/4.5_incubator 到这里下载用

C#中如何调用由Delphi 7.0创建的dll,数据结构体的约定怎么写?

问题描述 C#中如何调用由Delphi 7.0创建的dll,数据结构体的约定怎么写? C#中如何调用由Delphi 7.0创建的dll,数据结构体的约定怎么写? 解决方案 http://www.jb51.net/article/41177.htm 解决方案二: 注意内存对齐,类型的匹配等

如何在dll中创建CFrameWnd?

问题描述 请大家帮帮忙?新建一个mfcdll.在exe程序中调用该DLL的中某一函数,在这个函数里创建窗体(cframewnd),用create创建失败.困扰我好几天了. 解决方案 解决方案二:导出DLL中要使用MFC资源,记得在你的导出函数内第一行加上AFX_MANAGE_STATE(AfxGetStaticState())解决方案三:加了AFX_MANAGE_STATE(AfxGetStaticState())解决方案四:DLL中创建窗体的时候在那里出现了错误?如果Creat都不成功的话那应

解析VC中创建DLL,导出全局变量,函数和类的深入分析_C 语言

一.创建DLL1.在VC中新建一个Win32空项目MathLib:2.添加预编译头文件stdafx.h,定义导入导出控制符号: 复制代码 代码如下: //stdafx.h#pragma once#define MATHLIB_EXPORT 3.添加包含要导出的全局变量,函数和类的头文件MathLib.h: 复制代码 代码如下:  //MathLib.h #pragma once  #ifdef MATHLIB_EXPORT #define MATHLIBAPI __declspec(dllexp

C++ Builder中如何保持控件的位置及大小

C++ Builder/Delphi是Inprise(原Borland)公司广受欢迎的可视化C++/Pascal开发工具,利用它可极大地加快应用程序的开发速度.但是,也正因为其是可视化编程工具,将控件拖放到Form后,控件的位置就固定死了.随着Form的大小或屏幕分辨率的改变,控件和Form本身的位置往往变得非常混乱.本文将介绍一些正确定位控件及Form的方法. 利用OnResize事件改变控件位置及大小 C++ Builder/Delphi中的Form控件有一个OnResize事件,Form的

在C++Builder中使用Delphi文件

在使用多种语言和工具编写一个应用程序时,最为困难的事情之一是创建和维护定义文件的接口.幸运的是,C++Builder把这一切都替你做好了.当在项目中加入一个.PAS文件时,C++Builder会自动创建一个.HPP文件. 在CPP文件中,可以调用Pascal的函数.对象等.这为Delphi的程序员移植全部或部分的项目提供了便捷的途径. 下面是在C++Builder中使用Delphi代码的原则: 1.在C++Builder的窗体编辑器中,不能修改或编辑Delphi的窗体.但是可以修改Delphi窗

C++ Builder中保持控件的位置及大小

C++ Builder/Delphi是Inprise(原Borland)公司广受欢迎的可视化C++/Pascal开发工具,利用它可极大地加快应用程序的开发速度.但是,也正因为其是可视化编程工具,将控件拖放到Form后,控件的位置就固定死了.随着Form的大小或屏幕分辨率的改变,控件和Form本身的位置往往变得非常混乱.本文将介绍一些正确定位控件及Form的方法. 利用OnResize事件改变控件位置及大小 C++ Builder/Delphi中的Form控件有一个OnResize事件,Form的

C++Builder中实现控件数组的功能

Borland C++ Builder作为Inprise(原Borland)公司新推出的快速应用程序开发工具(RAD),具有威力强大的C++语言和快捷便利的可视化编程完美结合的优点,遗憾的是其没有直接提供像VB中的控件数组的功能,需要开发者自己编程实现. VB中的一个控件数组可以 允许多个控件共享同一个事件句柄 提供了运行期间增加一个控件的机制 提供了一种方便的组合控件的方法. 前两项在C++ Builder中早已实现,而且CB更有一个优点.即不同类型的控件可以使用相同的句柄(只需在相关控件的O

在C++Builder中开发CGI的一点点体会

c++|cgi 汗ing...这点点体会是面向新手的,高手可以不看.我对php的了解还不够深入,所以有时碰到用php一时没法解决的问题就求助于顺手的开发工具来做cgi了,而且安全性和稳定性也很容易提高,exe的程序也只是几十kb而已,速度还是可以的,如果做成dll,那么速度也是很快的. 一.根据页面请求方法的不同,获取传入数据有两种方法:1.如果是POST方法:例:提交表单中有一个文本框名叫 tName   那么在C++Builder中就应该如下获取:      AnsiString s = R