您的位置:首页 > 编程语言 > C语言/C++

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

2007-10-28 23:44 267 查看
这章主题是,编写支持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中的类!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: