我建立的一个Pub.DLL,用于存储一些公用的函数,其中一个如下,用来写入ini文件,问题是:
1,在主程序中调用这个函数,不带包编译的时候,一切正常
2,当主程序带包编译时,界面左上角的程序图标就会变成一个白方块。当然,如果不调用这个函数,即使带包编译也没什么问题,
看来问题就出在这个函数调用上,大家看看为什么会这样:主程序中的调用:
WriteFile('net','Server_name',cbxDB.Text);dll中的函数:procedure WriteFile(Section:string;KeyWord:string;Value:string);stdcall;
{
功能:向qc.ini特定字段中写数据
}
var
qc_ini:Tinifile;
filename:string;
begin
filename:= ExtractFilePath(paramstr(0))+'qc.ini';
qc_ini := Tinifile.Create(filename);
qc_ini.WriteString(Section,KeyWord,Value);
qc_ini.Free;
end;
1,在主程序中调用这个函数,不带包编译的时候,一切正常
2,当主程序带包编译时,界面左上角的程序图标就会变成一个白方块。当然,如果不调用这个函数,即使带包编译也没什么问题,
看来问题就出在这个函数调用上,大家看看为什么会这样:主程序中的调用:
WriteFile('net','Server_name',cbxDB.Text);dll中的函数:procedure WriteFile(Section:string;KeyWord:string;Value:string);stdcall;
{
功能:向qc.ini特定字段中写数据
}
var
qc_ini:Tinifile;
filename:string;
begin
filename:= ExtractFilePath(paramstr(0))+'qc.ini';
qc_ini := Tinifile.Create(filename);
qc_ini.WriteString(Section,KeyWord,Value);
qc_ini.Free;
end;
uses
INI files;
因此我想问题的出现可能是由于调用dll的缘故,大家说说调用dll还有什么其他需要注意的吗?
因此我想问题的出现可能是由于调用dll的缘故,大家说说调用dll还有什么其他需要注意的吗?
export加了吗?
external了吗?
调用dll是用静态还是动态?
type
TWriteFile=procedure(Section:string;KeyWord:string;Value:string);stdcall;procedure Test;
var
DllHnd: THandle;
WriteIni: TWriteFile;
begin DllHnd := LoadLibrary(PChar('project1.dll'));
try
if (DllHnd <> 0) then
begin
@WriteIni :=GetProcAddress(DllHnd, 'WriteFile');
if (@WriteIni<>nil) then
WriteIni('abc','cde','abc');
else
begin
application.MessageBox(PChar('DLL加载出错,DLL可能不存在!'), PChar('错误'),
MB_ICONWARNING or MB_OK);
end;
end;
finally
FreeLibrary(DllHnd);
end;
end;
//DLL
procedure WriteFile(Section:string;KeyWord:string;Value:string);stdcall;
{
功能:向qc.ini特定字段中写数据
}
var
qc_ini:Tinifile;
filename:string;
begin
filename:= ExtractFilePath(paramstr(0))+'qc.ini';
qc_ini := Tinifile.Create(filename);
qc_ini.WriteString(Section,KeyWord,Value);
qc_ini.Free;
end;exports
WriteFile;
1、继续维持带包编译
2、把静态引入DLL改成动态加载DLL,获取导出函数OK!
我把所有对公用dll的函数引用都去掉了,把这些函数直接写在主程序种,然后再带包编译就好了,不过真正的原因还没有找出,哎