浅谈在Delphi中Dll调试方法以及怎样在Dll中使用数据模块DataModule(或表单Form)
2007-11-04 13:22
836 查看
本人初学Delphi,今天在编写一个DLL过程中用到了数据模块DataModule,刚刚接触这部分内容,遇到了很多问题,由于手头参考书不多,只能上网查询,通过Baidu和CSDN的帮助,逐一解决了存在的问题,同时心中也渐渐对这一部分有了大概的了解。现在就总结一下,也希望能帮助像我这样的菜鸟能少走些弯路。
一、DLL调试方法:
(1)、[Project-->Add Existing Project...]将DLL和宿主程序(就是使用本DLL的程序)添加到一个工程组中,可以同时调试DLL和宿主程序。
(2)、 [Run-->Parameters... ]在Host Application中填入宿主程序的完整路径然后选择
[ Project|Options.. ]选择Directories/Conditionals页面在Output directory中填入宿主程序所在目录(这是将编译的DLL程序输出到宿主程序所在目录下),然后就可以按运行(F9)来运行程序,在你需要观看的地方加入断点(F5),如正常使用的操作主程序,调用你的函数/过程的时候就会在你的断点处停下,可单步执行。按Ctrl + F7可以加入变量观察。有一招在DLL的工程文件选项中
ProjectOptionsLinkerEXE and DLL Options
把Include TD32 debug Info和Include remote debug symbols勾上试试。
二、DLL中使用数据模块DataModule(或表单Form)
在DLL工程中使用到数据模块或表单,必须注意:在DLL中表单或数据模块都不是自动创建的,需要自己手工创建!这也是好多新手容易犯的毛病。
那么如何创建呢?下面是一个简单的例子(DLL的完整源码),必要的地方加以解释:
library DB_Excel;
uses
SysUtils,
Classes,Forms, activex,
main in 'main.pas' {DataModule1: TDataModule};//DLL中使用到的数据模块
{$R *.res}
//这是一个EXCEL导入数据到Access中的函数。
function ExcelToAccess(ExcelName,Sheet,AccessName,DB_Table:string):Boolean;stdcall;
Var sSql : string;
begin
try
CoInitialize(nil); //注意必须要添加这句
DataModule1 := TDataModule1.create(application); //在这里创建DataModule1
DataModule1.ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
AccessName + ';Persist Security Info=False';
DataModule1.ADOConnection1.Connected := true;
DataModule1.adoquery1.Close;
DataModule1.adoquery1.SQL.Clear;
sSql :=
'INSERT INTO '+DB_Table + ' SELECT *' +
' FROM [excel 8.0;database=' + ExcelName + '].['+Sheet+'$]';
DataModule1.adoquery1.Parameters.Clear;
DataModule1.adoquery1.ParamCheck := false;
DataModule1.adoquery1.SQL.Text := sSql;
DataModule1.adoquery1.Execsql;
result := true;
except
result :=false;
end;
freeandnil(DataModule1); //使用完后要释放,不然会报错的!
end;
//输出接口
exports
ExcelToAccess;
begin
end.
DLL中使用表单,应该与此类似,注意使用前要创建,使用完后要释放,这样应该就不会错了。
一、DLL调试方法:
(1)、[Project-->Add Existing Project...]将DLL和宿主程序(就是使用本DLL的程序)添加到一个工程组中,可以同时调试DLL和宿主程序。
(2)、 [Run-->Parameters... ]在Host Application中填入宿主程序的完整路径然后选择
[ Project|Options.. ]选择Directories/Conditionals页面在Output directory中填入宿主程序所在目录(这是将编译的DLL程序输出到宿主程序所在目录下),然后就可以按运行(F9)来运行程序,在你需要观看的地方加入断点(F5),如正常使用的操作主程序,调用你的函数/过程的时候就会在你的断点处停下,可单步执行。按Ctrl + F7可以加入变量观察。有一招在DLL的工程文件选项中
ProjectOptionsLinkerEXE and DLL Options
把Include TD32 debug Info和Include remote debug symbols勾上试试。
二、DLL中使用数据模块DataModule(或表单Form)
在DLL工程中使用到数据模块或表单,必须注意:在DLL中表单或数据模块都不是自动创建的,需要自己手工创建!这也是好多新手容易犯的毛病。
那么如何创建呢?下面是一个简单的例子(DLL的完整源码),必要的地方加以解释:
library DB_Excel;
uses
SysUtils,
Classes,Forms, activex,
main in 'main.pas' {DataModule1: TDataModule};//DLL中使用到的数据模块
{$R *.res}
//这是一个EXCEL导入数据到Access中的函数。
function ExcelToAccess(ExcelName,Sheet,AccessName,DB_Table:string):Boolean;stdcall;
Var sSql : string;
begin
try
CoInitialize(nil); //注意必须要添加这句
DataModule1 := TDataModule1.create(application); //在这里创建DataModule1
DataModule1.ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
AccessName + ';Persist Security Info=False';
DataModule1.ADOConnection1.Connected := true;
DataModule1.adoquery1.Close;
DataModule1.adoquery1.SQL.Clear;
sSql :=
'INSERT INTO '+DB_Table + ' SELECT *' +
' FROM [excel 8.0;database=' + ExcelName + '].['+Sheet+'$]';
DataModule1.adoquery1.Parameters.Clear;
DataModule1.adoquery1.ParamCheck := false;
DataModule1.adoquery1.SQL.Text := sSql;
DataModule1.adoquery1.Execsql;
result := true;
except
result :=false;
end;
freeandnil(DataModule1); //使用完后要释放,不然会报错的!
end;
//输出接口
exports
ExcelToAccess;
begin
end.
DLL中使用表单,应该与此类似,注意使用前要创建,使用完后要释放,这样应该就不会错了。
相关文章推荐
- DELPHI中使用DLL的方法以及INSTALLSHIELD中使用DLL方法
- 四【用django2.0来开发】后台会员管理(二) ModelForm表单的使用方法以及数据验证
- Delphi怎样在Dll中使用数据模块DataModule
- 表单包含file上传文件提交,使用ajaxSubmint或者ajaxForm 遇到的问题以及解决方法
- 浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法
- 浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法
- 浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法
- DELPHI使用TClientDataSet时不携带MIDAS.DLL的方法
- 使用ajax方法实现form表单的提交
- 使用ajax 提交多个form表单以及其他参数
- javascript 跨域POST 使用form表单 获取提交返回内容的方法
- 浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法
- form表单是modelAttribute以及path属性的使用
- 使用get方法提交form表单时出现乱码解决方法
- yii2.0 Activeform表单部分组件使用方法
- 总结:form中使用onSubmit="return false"防止表单自动提交,以及submit和button提交表单的区别
- Keil MDK使用J-LINK分别在Sram,Nor Flash以及Sdram中调试代码的原理和方法
- 快速学习jQuery插件 Form表单插件使用方法
- System.Data.SQLite.dll不能编译成AnyCPU问题的解决方案,以及它跨x86和x64的使用方法。
- javascript在form表单中使用button按钮实现submit提交方法