用CodeGear C++ Builder 2007编写dll程序(二)

这章主题是,编写支持VCL的DLL。

第一步:建立dll

建立dll工程。如下图选择

 

确定后,保存工程名为usevcldll,新增一个about窗体,一个usevcl单元:usevcl.cpp/usevcl.h,

在usevcl.h中的代码如下:

#include <vcl.h>
#include <StdCtrls.hpp>
#include "about.h"
extern "C" __declspec(dllexport) int __stdcall GetAKSControlType();
extern "C" __declspec(dllexport) const char * __stdcall GetAKSControlName();
extern "C" __declspec(dllexport) void __stdcall TestSetEditValue(TEdit * aEdit);
extern "C" __declspec(dllexport) TForm * __stdcall GetAboutForm(TForm * aOwner);

在usevcl.cpp中的代码如下:

int __stdcall GetAKSControlType()
{
    return 1;
}
const char * __stdcall GetAKSControlName()
{
    return "AKSControl_Demo";
}

void __stdcall TestSetEditValue(TEdit * aEdit)
{
 aEdit->Text = "This is Set Edit Value!";
}
TForm * __stdcall GetAboutForm(TForm * aOwner)
{
    TAboutBox * frm = new TAboutBox(aOwner);
    return frm;
}

然后,编译即可。这时会生成usevcldll.dll和usevcldll.lib等文件。在这里我们使用的是动态装载dll,usevcldll.lib就暂时不用了。

第二步,动态调用dll

我们再新建一个vcl Forms Application程序,保存为testdll

然后在生入如下界面窗体

窗口定义如下:主界面头文件:unit2.h
class TForm2 : public TForm
{
__published: // IDE-managed Components
 TButton *Button1;
 TEdit *Edit1;
 TEdit *Edit2;
 TLabel *Label1;
 TLabel *Label2;
 TEdit *Edit3;
 void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public:  // User declarations
 __fastcall TForm2(TComponent* Owner);
};
代码文件:unit2.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "XFrmMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
typedef int __stdcall (* FGetAKSControlType )();
typedef const char * __stdcall (*FGetASKControlName)();
typedef void __stdcall (*FTestSetEditValue)(TEdit * aEdit);
typedef TForm * __stdcall(*FGetAbout)(TForm * aOwner);

//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
 : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
 //
    FGetAKSControlType GetAKSControlType;
    FGetASKControlName GetASKControlName;
    FTestSetEditValue  TestSetEditValue;
    FGetAbout GetAbout;
    HINSTANCE dd;
    dd = LoadLibrary("usevcldll.dll");
    GetAKSControlType = (FGetAKSControlType)GetProcAddress(dd,"GetAKSControlType");

    GetASKControlName = (FGetASKControlName)GetProcAddress(dd,"GetAKSControlName");
    TestSetEditValue = (FTestSetEditValue)GetProcAddress(dd,"TestSetEditValue");

 GetAbout = (FGetAbout)GetProcAddress(dd,"GetAboutForm");
    Edit1->Text = GetAKSControlType();
    Edit2->Text = GetASKControlName();
    TestSetEditValue(Edit3);
    TForm * frmAbout = GetAbout(this);
    frmAbout->ShowModal();
    delete frmAbout;
    FreeLibrary(dd);

}
//---------------------------------------------------------------------------

代码完成后,将usevcldll.dll复制到debug或release目录下,运行它,结果如下

再按下button1,就会弹出about对话框,并设置Edit的值。


这样,我们就可以在dll中定使用vcl了,下一章,将讲述使用静态调用dll的方式,并且支持dll中的类!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值