function abc@8(a,b:integer):integer; stdcall;external 'Dql10.dll';
总是出错,光标指向@,我想因为@是delphi中的关键字,所以不能用,但是dll中就是这样写的
改dll是不可能的了,有什么其他办法,请指教

解决方案 »

  1.   

    我会BCB,对DELPHI不是很熟,BCB动态可以,我想DELPHI
    肯定也可以,如此而已,你要查delphi资料
      

  2.   

    动态是通过  DllHandle:= LoadLibrary('xxx.dll');
               MyProc:= GetProcAddress(DllHandle,'abc@8');  
               再执行MyProc
    明显地避免了语法出错的问题     
      

  3.   

    delphi静态调用方便,所以用动态调用的人就少
      

  4.   

    到www.smiling.com.cn的Delphi共享联盟去找我发的“阿猫Delphi入门之路”系列
      

  5.   

    看样子 '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.
      

  6.   

    这样试试:
    function abc8(a,b:integer):integer; stdcall;external 'Dql10.dll' name 'abc@8';
      

  7.   

    --------------------------------------------------------------------------------
     
      {阿猫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.