救命的问题,dll中有一个函数abc@8,delphi没有办法调用,因为@的缘故,怎办? function abc@8(a,b:integer):integer; stdcall;external 'Dql10.dll';总是出错,光标指向@,我想因为@是delphi中的关键字,所以不能用,但是dll中就是这样写的改dll是不可能的了,有什么其他办法,请指教 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我会BCB,对DELPHI不是很熟,BCB动态可以,我想DELPHI肯定也可以,如此而已,你要查delphi资料 动态是通过 DllHandle:= LoadLibrary('xxx.dll'); MyProc:= GetProcAddress(DllHandle,'abc@8'); 再执行MyProc明显地避免了语法出错的问题 delphi静态调用方便,所以用动态调用的人就少 到www.smiling.com.cn的Delphi共享联盟去找我发的“阿猫Delphi入门之路”系列 看样子 'Dql10.dll'是用 C (bc or vc)写的.并且未用 extern "C" 关键字用涵数名是不行了,但可用 函数的索引号.一样可以静态调用.Micrsoft Visual Studio 6.0 中有 "Depends"可查看 XXX.DLL中的索引号.但有的函数无索引号.可参考http://www.csdn.net/expert/topic/157/157336.shtm. 这样试试:function abc8(a,b:integer):integer; stdcall;external 'Dql10.dll' name 'abc@8'; -------------------------------------------------------------------------------- {阿猫Delphi入门4} { 原想再整理一下(主要是怕出的太快了就没了下文:)),可缺钙兄赏光,要过一下 法眼,我就显丑了。} unit FrmMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; {想要动态调用DLL中的函数,先要有一个该DLL的句柄,然后要取得所要的函数的地址。} type { 前面2、3中写的那个动态链接库“SysInfo.dll”还记得吗?里面所有的函数都是下面这 个类型。} TSysFun = Function : PChar; Stdcall; TFormMain = class(TForm) {我在Form上扔了一个ListBox} ListBox: TListBox; procedure FormActivate(Sender: TObject); private { Private declarations } {后面要用这个句柄。} FILibHandle : THandle; {这是调用DLL和调用函数的函数和过程,我在里面加入了异常检查。} {以前,我在类中加入函数后,总是用复制、粘贴把它的声明贴到实现部分(现在想想好傻), 直到有天看到一位同事在声明上按下Ctrl+Shift+C……} procedure FLoadLibrary(LibraryName : String) ; function FGetSysInfo(Key : String ) : String ; public { Public declarations } end; var FormMain: TFormMain; implementation {$R *.DFM} procedure TFormMain.FLoadLibrary(LibraryName: String); begin {*************************************************** LoadLibrary和LoadLibraryEx是两个调用动态链接库的API,Microsoft和Borland都推荐用 LoadLibraryEx,可我试了XXX次,只有一种格式可以成功:FILibHandle := LoadLibraryEx(PChar(LibraryName) , 0 , LOAD_WITH_ALTERED_SEARCH_PATH) ; 第一个参数是DLL的名字,第二个参数目前版本没有用,填0就是了,第三个参数有三种选项,详细解释可以查MSDN,反正在win98se上好像只有这个参数可用,这样一来,除了写的长一些,我看不出它们的区别了,不知哪位高手可以指教一下。 ****************************************************} FILibHandle := LoadLibrary(PChar(LibraryName)) ; {如果返回句柄不正常,就抛出一个异常。} if FILibHandle = 0 then begin Raise Exception.Create(IntToStr(GetLastError)); close(); end end; function TFormMain.FGetSysInfo(Key: String): String; var GetSysInfo : TSysFun; begin {前面的LoadLibraryEx参数没选对时,它总在这里出问题,跟踪GetSysInfo发现它没有在这里被赋值} {GetProcAddress是取得DLL中函数地址的API,因为我要在下面的代码中多次调用以下代码,所以把它们封在了一起。} @GetSysInfo := GetProcAddress(FILibHandle , PChar('P_Reg_' + key)); {如果没有正确的反回函数地址,就抛出一个异常,我那时总收到一个“6”,查微软提供的的错误列表, 是“无效句柄”。如果没有错,就让它返回我要的字符串。} if Assigned(GetSysInfo) {其实我试了一下,then Result := String(GetSysInfo)也没错。} then Result := String(TSysFun(GetSysInfo)) else Raise Exception.Create(IntToStr(GetLastError)); end; procedure TFormMain.FormActivate(Sender: TObject); begin FLoadLibrary('SysInfo.dll') ; with ListBox.Items do begin Add('BootDir : ' + FGetSysInfo('BootDir')); Add('BootHost : ' + FGetSysInfo('BootHost')); Add('ConfigPath : ' + FGetSysInfo('ConfigPath')); Add('HostWinBootDir : ' + FGetSysInfo('HostWinBootDir')); Add('MachineDir : ' + FGetSysInfo('MachineDir')); Add('MediaPath : ' + FGetSysInfo('MediaPath')); Add('SharedDir : ' + FGetSysInfo('SharedDir')); Add('SourcePath : ' + FGetSysInfo('SourcePath')); Add('SysDir : ' + FGetSysInfo('SysDir')); Add('SetupScratchDir : ' + FGetSysInfo('SetupScratchDir')); Add('WinAdminDir : ' + FGetSysInfo('WinAdminDir')); Add('WinBootDir : ' + FGetSysInfo('WinBootDir')); end; {最后别忘了把调用的库释放噢,我就忘过:P,最好在写代码时,先写Load,紧接着就写Free, 再往中间填代码,养成好习惯。} FreeLibrary(FILibHandle) ; end; end. {如果我们只是要静态调用,只要写这么一个单元,在其它模块里引用,就可以了。} unit FunctionD; interface {一个好习惯,把重复使用的字符串定义为一个常量,可以减少文字量,还好维护。} const Lib_Name = 'SysInfo.Dll'; function SysBootDir : PChar; external Lib_Name name 'P_Reg_BootDir' function SysBootHost : PChar; external Lib_Name name 'P_Reg_BootHost' function SysConfigPath : PChar; external Lib_Name name 'P_Reg_ConfigPath' function SysHostWinBootDir : PChar; external Lib_Name name 'P_Reg_HostWinBootDir' function SysMachineDir : PChar; external Lib_Name name 'P_Reg_MachineDir' function SysMediaPath : PChar; external Lib_Name name 'P_Reg_MediaPath' function SysSharedDir : PChar; external Lib_Name name 'P_Reg_SharedDir' function SysSourcePath : PChar; external Lib_Name name 'P_Reg_SourcePath' function SysSysDir : PChar; external Lib_Name name 'P_Reg_SysDir' function SysSetupScratchDir : PChar; external Lib_Name name 'P_Reg_SetupScratchDir' function SysWinAdminDir : PChar; external Lib_Name name 'P_Reg_WinAdminDir' function SysWinBootDir : PChar; external Lib_Name name 'P_Reg_WinBootDir' function SysWinDir : PChar; external Lib_Name name 'P_Reg_WinDir' implementation end. 关于chart自身坐标与屏幕坐标的问题 急~(刚才的发错版块了 不好意思) 关于控件求助 调用bpl包中的子窗体 请教如何设置IIS6.0能使Delphi 编制的CGI程序能正确访问! 用adodataset连接数据库,如何删除选中的记录? 数据库发布问题 各位请推荐一款给程序员用的手提电脑 如何让表里的数据自动生成为excel? 其实,Data2000并非大家说的那样啊..(恳请进来看看) 骂: Delphi6的新特性 请教:为何数据库数据无法在网页上显示? 急急,都问两次了,众大侠救兄弟一救!!?(关于bmp处理)
肯定也可以,如此而已,你要查delphi资料
MyProc:= GetProcAddress(DllHandle,'abc@8');
再执行MyProc
明显地避免了语法出错的问题
用涵数名是不行了,但可用 函数的索引号.一样可以静态调用.
Micrsoft Visual Studio 6.0 中有 "Depends"可查看 XXX.DLL中的索引号.但有的函数无索引号.可参考http://www.csdn.net/expert/topic/157/157336.shtm.
function abc8(a,b:integer):integer; stdcall;external 'Dql10.dll' name 'abc@8';
{阿猫Delphi入门4}
{ 原想再整理一下(主要是怕出的太快了就没了下文:)),可缺钙兄赏光,要过一下
法眼,我就显丑了。}
unit FrmMain; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls; {想要动态调用DLL中的函数,先要有一个该DLL的句柄,然后要取得所要的函数的地址。}
type
{ 前面2、3中写的那个动态链接库“SysInfo.dll”还记得吗?里面所有的函数都是下面这
个类型。}
TSysFun = Function : PChar; Stdcall;
TFormMain = class(TForm)
{我在Form上扔了一个ListBox}
ListBox: TListBox;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
{后面要用这个句柄。}
FILibHandle : THandle;
{这是调用DLL和调用函数的函数和过程,我在里面加入了异常检查。}
{以前,我在类中加入函数后,总是用复制、粘贴把它的声明贴到实现部分(现在想想好傻), 直到有天看到一位同事在声明上按下Ctrl+Shift+C……}
procedure FLoadLibrary(LibraryName : String) ;
function FGetSysInfo(Key : String ) : String ;
public
{ Public declarations }
end;
var
FormMain: TFormMain; implementation {$R *.DFM} procedure TFormMain.FLoadLibrary(LibraryName: String);
begin
{***************************************************
LoadLibrary和LoadLibraryEx是两个调用动态链接库的API,Microsoft和Borland都推荐用
LoadLibraryEx,可我试了XXX次,只有一种格式可以成功:FILibHandle := LoadLibraryEx(PChar(LibraryName) , 0 , LOAD_WITH_ALTERED_SEARCH_PATH) ; 第一个参数是DLL的名字,第二个参数目前版本没有用,填0就是了,第三个参数有三种选项,详细解释可以查MSDN,反正在win98se上好像只有这个参数可用,这样一来,除了写的长一些,我看不出它们的区别了,不知哪位高手可以指教一下。
****************************************************}
FILibHandle := LoadLibrary(PChar(LibraryName)) ;
{如果返回句柄不正常,就抛出一个异常。}
if FILibHandle = 0 then
begin
Raise Exception.Create(IntToStr(GetLastError));
close();
end
end; function TFormMain.FGetSysInfo(Key: String): String;
var
GetSysInfo : TSysFun;
begin
{前面的LoadLibraryEx参数没选对时,它总在这里出问题,跟踪GetSysInfo发现它没有在这里被赋值}
{GetProcAddress是取得DLL中函数地址的API,因为我要在下面的代码中多次调用以下代码,所以把它们封在了一起。}
@GetSysInfo := GetProcAddress(FILibHandle , PChar('P_Reg_' + key));
{如果没有正确的反回函数地址,就抛出一个异常,我那时总收到一个“6”,查微软提供的的错误列表, 是“无效句柄”。如果没有错,就让它返回我要的字符串。}
if Assigned(GetSysInfo)
{其实我试了一下,then Result := String(GetSysInfo)也没错。}
then Result := String(TSysFun(GetSysInfo))
else
Raise Exception.Create(IntToStr(GetLastError));
end; procedure TFormMain.FormActivate(Sender: TObject);
begin
FLoadLibrary('SysInfo.dll') ;
with ListBox.Items do
begin
Add('BootDir : ' + FGetSysInfo('BootDir'));
Add('BootHost : ' + FGetSysInfo('BootHost'));
Add('ConfigPath : ' + FGetSysInfo('ConfigPath'));
Add('HostWinBootDir : ' + FGetSysInfo('HostWinBootDir'));
Add('MachineDir : ' + FGetSysInfo('MachineDir'));
Add('MediaPath : ' + FGetSysInfo('MediaPath'));
Add('SharedDir : ' + FGetSysInfo('SharedDir'));
Add('SourcePath : ' + FGetSysInfo('SourcePath'));
Add('SysDir : ' + FGetSysInfo('SysDir'));
Add('SetupScratchDir : ' + FGetSysInfo('SetupScratchDir'));
Add('WinAdminDir : ' + FGetSysInfo('WinAdminDir'));
Add('WinBootDir : ' + FGetSysInfo('WinBootDir'));
end;
{最后别忘了把调用的库释放噢,我就忘过:P,最好在写代码时,先写Load,紧接着就写Free, 再往中间填代码,养成好习惯。}
FreeLibrary(FILibHandle) ;
end; end. {如果我们只是要静态调用,只要写这么一个单元,在其它模块里引用,就可以了。} unit FunctionD; interface
{一个好习惯,把重复使用的字符串定义为一个常量,可以减少文字量,还好维护。}
const
Lib_Name = 'SysInfo.Dll'; function SysBootDir : PChar; external Lib_Name name 'P_Reg_BootDir'
function SysBootHost : PChar; external Lib_Name name 'P_Reg_BootHost'
function SysConfigPath : PChar; external Lib_Name name 'P_Reg_ConfigPath'
function SysHostWinBootDir : PChar; external Lib_Name name 'P_Reg_HostWinBootDir'
function SysMachineDir : PChar; external Lib_Name name 'P_Reg_MachineDir'
function SysMediaPath : PChar; external Lib_Name name 'P_Reg_MediaPath'
function SysSharedDir : PChar; external Lib_Name name 'P_Reg_SharedDir'
function SysSourcePath : PChar; external Lib_Name name 'P_Reg_SourcePath'
function SysSysDir : PChar; external Lib_Name name 'P_Reg_SysDir'
function SysSetupScratchDir : PChar; external Lib_Name name 'P_Reg_SetupScratchDir'
function SysWinAdminDir : PChar; external Lib_Name name 'P_Reg_WinAdminDir'
function SysWinBootDir : PChar; external Lib_Name name 'P_Reg_WinBootDir'
function SysWinDir : PChar; external Lib_Name name 'P_Reg_WinDir'
implementation end.