在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言 站长有个习惯,用 Delphi 作项目的公共对话框,因为 Delphi 的可视化编辑表现极佳,可以方便地显示真彩位图,或 Jpeg 格式图形,这在 VC 下是很麻烦的。 在工程中引入一个动态库一般有两种方法,一种是隐式链接,VC 在使用隐式链接方式时,编译器需要 Lib 文件支持,但由 Delphi 编译生成的动态库并没有 Lib 文件,需要用 DUMPBIN 工具手工生成,随着你的工程的开发进展,这个动态可能会不断的增加新的对话框,你又分不断的用 DUMPBIN 工具重重复的劳动,我从不会作这种麻烦事的。而另一种是显式加载方式,显载加载方式就是在需要使用动态库中的导出函数的地方使用 LoadLibrary 函数显式加载该动态库到内存中,不再使用时可以用 FreeLibrary 函数释放动态库占用的内存,这种动态库的使用方式不需要 Lib 文件支持,很适合在 VC 中调用由 Delphi 生成的动态库,我一般都是使用这种方式的。 这里以一个常用的用户登录的例子来示范如果在 VC 中使用由 Delphi 构造的公共对话框。 用 Delphi 创建基于对话框的动态库 这篇文章不是教你如何用 Delphi 来创建动态库的,我假设你可以无障碍的在 Delphi 中创建动态库,所以这里要说的内容并不多。 废话少说,现在启动 Delphi 的 IDE,创建一个动态库工程 CommonDlg,为该动态库工程新建一个窗口,如图所示: 修改窗口的主要属性:Name=frmLoginDlg、BorderStyle=bsDialog、Position=poMainFormCenter;修改窗口中“确认”按钮的属性:Kind=bkOK;修改窗口中“取消”按钮的属性:Kind=bkCancel;在 LoginDlg 单元中添加一个动态库的导出 API 函数 ShowLoginDlg,它的定义原型和实现如下:
// 设置一个用户账号的原始值,比如指定一个默认的用户账号
procedure TfrmLoginDlg.SetParams(szUser: PChar; szPassword: PChar); begin edtUser.Text := StrPas(szUser); edtPassword.Text := ''; end; // 返回用户输入的用户账号和密码值 procedure TfrmLoginDlg.GetParams(szUser: PChar; szPassword: PChar); begin StrCopy(szUser, PChar(edtUser.Text)); StrCopy(szPassword, PChar(edtPassword.Text)); end; 在动态库的工程 CommonDlg 中导出该 API 函数: exports ShowLoginDlg;
动态库导出函数管理类 为了方便调用由以上步骤生成的动态库,这里为你提供一个辅助类,该类封装动态库的加载和释放。创建该类这前首先为 CommonDlg.dll 的导出函数编写 VC 中的原型:
typedef int (__stdcall *PShowLoginDlg)(HWND, LPSTR szUser, LPSTR szPassword);
创建辅助类 CCommonDlg 类:
class CCommonDlg
;
以上通过 CCommonDlg 类的构造和析构函数来实现:
// 构造函数
// 该对象在第一次被实例化时将加载动态库 }
在需要使用动态库中的对话框的地方创建一个 CCommonDlg 实例,就可以像一般的类那样使用动态库中定义的导出函数,而不必关心什么时候要加载该动态,什么时候释放动态。下面是该类的使用示范:
void CVC_AppDlg::OnButtonLoginClicked()
CCommonDlg 类有一定的通用性,可广泛适用于其他动态库导出函数的封装。而你要作的只是修改默认动态库定义:
#define COMMONDLG_DLL_FILENAME "CommonDlg.dll" // 动态库的文件名
再如下面的形式为你的动态定义导出函数的原型:
typedef int (__stdcall *PShowLoginDlg)(HWND, LPSTR szUser, LPSTR szPassword);
并在CCommonDlg类定义中增加一个 static 类型的函数指针数据成员:
protected
static PShowLoginDlg m_pShowLoginDlg; // 引出函数
public:
static PShowLoginDlg ShowLoginDlg; 然后在 LoadProcAddress 函数的实现中编写该函数的导出代码:
// 用于加载动态库的所有引出函数
// 在多个对象的实例中,该函数仅被调用一次 void CCommonDlg::LoadProcAddress() }
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论