Dll部分代码
function GetDataSet(str,conn:PChar):TADODataSet;stdcall;
。
function GetDataSet(str,conn:PChar): TADODataSet;stdcall;
var
ds:TADODataSet;
begin
//coInitialize(nil);
ds:=TADODataSet.Create(nil);
ds.Close;
ds.ConnectionString:=conn;
ds.CommandText:= str; try
ds.Open;
GetDataSet:=ds;
//StrDispose(str);
except
on E:Exception do
begin
ShowMessage(E.Message);
GetDataSet:=nil;
end;
end;
//CoUninitialize;
end;initialization;
begin
CoInitialize(nil);//创建
end;
finalization;
begin
CoUninitialize;
end;
调用部分
var
datas:TADODataSet;
sql,conn:string;
i:Integer;
begin
sql:='select GrCode from ZwGrml';
conn:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=HNR_Data_2008';
datas:=GetDataSet(PChar(sql),PChar(conn));
try
DBGridEh1.DataSource.DataSet:=datas;
except
on E:Exception do
begin
ShowMessage(E.Message);
end;
end;
补充 我用
for i := 1 to datas.RecordCount do
begin
datas.RecNo:=i;
Memo1.Lines.Add(datas.FieldByName('GrCode').AsString);
end;
往Memo1里添加数据正常!!但是往DBGridEh1 或是DBGrid1 里填充就提示错误了!提示invalid pointer operation 无效类型指针!!不知道为什么!
function GetDataSet(str,conn:PChar):TADODataSet;stdcall;
。
function GetDataSet(str,conn:PChar): TADODataSet;stdcall;
var
ds:TADODataSet;
begin
//coInitialize(nil);
ds:=TADODataSet.Create(nil);
ds.Close;
ds.ConnectionString:=conn;
ds.CommandText:= str; try
ds.Open;
GetDataSet:=ds;
//StrDispose(str);
except
on E:Exception do
begin
ShowMessage(E.Message);
GetDataSet:=nil;
end;
end;
//CoUninitialize;
end;initialization;
begin
CoInitialize(nil);//创建
end;
finalization;
begin
CoUninitialize;
end;
调用部分
var
datas:TADODataSet;
sql,conn:string;
i:Integer;
begin
sql:='select GrCode from ZwGrml';
conn:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=HNR_Data_2008';
datas:=GetDataSet(PChar(sql),PChar(conn));
try
DBGridEh1.DataSource.DataSet:=datas;
except
on E:Exception do
begin
ShowMessage(E.Message);
end;
end;
补充 我用
for i := 1 to datas.RecordCount do
begin
datas.RecNo:=i;
Memo1.Lines.Add(datas.FieldByName('GrCode').AsString);
end;
往Memo1里添加数据正常!!但是往DBGridEh1 或是DBGrid1 里填充就提示错误了!提示invalid pointer operation 无效类型指针!!不知道为什么!
解决方案 »
- delphi 如何读dat文件到缓冲区?
- CB倒了,Delphi也倒了,接下来是Borland吗?
- 一个关于继承的问题,请大侠们看看!
- Win2000+Delphi6+ExpressGrid4写的程序在Win200和XP下都能正常运行,但在98下一运行就非法操作?
- 如何设置aboutbox中各参数的值?
- 50分相求Delphi5.0 EE 的序列码
- 请教:使用经过解密后的第三方控件做出的软件会不会出问题?
- 各位,关于编程工具的选择一目了然。
- 如何得到鼠标当前指向的dbgrid的column的值
- 有关TThread的FreeOnTerminte再次提问
- FR3报表换页后赋值
- 怎么才能实现找到动态数组中的最大值
procedure GetDataSet(str,conn:PChar; ds: TADODataSet);stdcall;
begin
ds.Close;
ds.ConnectionString:=conn;
ds.CommandText:= str;
ds.Open;
end;
end; initialization;
begin
CoInitialize(nil);//创建
end;
finalization;
begin
CoUninitialize;
end;
调用部分
var
datas:TADODataSet; // 应该放到private部分
sql,conn:string;
i:Integer;
begin
datas := TADODataSet.Create(nil);
sql:='select GrCode from ZwGrml';
conn:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=HNR_Data_2008';
datas:=GetDataSet(PChar(sql),PChar(conn), datas );
DBGridEh1.DataSource.DataSet:=datas;
end;
procedure GetDataSet(str,conn:PChar; ds: TADODataSet);stdcall;
procedure GetDataSet(str,conn:PChar; ds: TADODataSet);stdcall;
begin
ds.Close;
ds.ConnectionString:=conn;
ds.CommandText:= str;
ds.Open;
end; initialization;
begin
CoInitialize(nil);//创建
end;
finalization;
begin
CoUninitialize;
end;
调用部分
var
datas:TADODataSet; // 应该放到private部分
sql,conn:string;
i:Integer;
begin
datas := TADODataSet.Create(nil); // 应该放到FormCreate部分 // Destroy释放
sql:='select GrCode from ZwGrml';
conn:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=HNR_Data_2008';
datas:=GetDataSet(PChar(sql),PChar(conn), datas );
DBGridEh1.DataSource.DataSet:=datas;
end;
procedure GetDataSet(str,conn:PChar; ds: TADODataSet);stdcall;
begin
ds.Close;
ds.ConnectionString:=conn;
ds.CommandText:= str;
ds.Open;
end; initialization;
begin
CoInitialize(nil);//创建
end;
finalization;
begin
CoUninitialize;
end;
调用部分
var
datas:TADODataSet; // 应该放到private部分
sql,conn:string;
i:Integer;
begin
datas := TADODataSet.Create(nil); // 应该放到Form.onCreate部分 // form.onDestroy释放
sql:='select GrCode from ZwGrml';
conn:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=HNR_Data_2008';
GetDataSet(PChar(sql),PChar(conn), datas );
DBGridEh1.DataSource.DataSet:=datas;
end;
但是我想问一下!为什么 得传ADODateSat进去才不会出错呢!
DBGridEh1.DataSource.DataSet:=datas;
当调用完毕dll后,dll的内存管理器要清理函数的栈信息,这时datas已经被清除了,而主调程序中的DBGridEh1.DataSource.DataSet使用的是一个无效的指针!
2.
Memo1.Lines.Add()这时Add内添加的数据是一份值拷贝,即便dll内的值被释放也不影响