如题请说明原因和解决方法。

解决方案 »

  1.   

    在程序中只能调用dll中的导出函数。
    用exports fun1;进行导出。具体可以找个实例看看就知道了。
      

  2.   

    我的意思是我在dll中的导出函数中调用了api函数,结果我到另一应用程序调用时,他就提示错误,原码如下:
    dll:
    library MyDll;
    uses
      SysUtils, dialogs, Classes,ShellApi,windows;
    function Hobbit (value:integer): string; stdcall;
    begin
    case value of
    1: result := 'Frodo';
    2: result := 'Samwise';
    3: result := 'Pippin';
    4: result := 'Meriadoc';
    else
    result := 'Must be an Orc!';
    end;
    end;
    function Larger (Val1, Val2: integer): pchar; stdcall;
    var
    windir:pchar;
    begin
    windir:=char(0);
    GetWindowsDirectory(windir,128); //获得安装目录
    if Val1 > Val2 then
    result := windir
    else if Val2 > Val1 then
    result := windir
    else
    result := 'hello';
    end;
    procedure Elephants;stdcall;
    begin
    ShowMessage ('Pink Elephants on Parade');
    end;
    exports
    Hobbit ,
    Larger ,
    Elephants ;
    begin
    end.
    应用程序:
    implementation
    function Hobbit (value:Integer):string; stdcall; external 'MyDll.dll' ;
    function Larger (val1,val2:Integer): pchar;stdcall; external 'MyDll.dll';
    procedure Elephants;stdcall;  external 'MyDll.dll';
    {$R *.DFM}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Memo1.lines.add (Hobbit(5));
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    Memo1.lines.add (string(Larger(12,25)) + ' is larger than 12');
    end;
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    Elephants;
    end;
    end.出错信息(安button2调用large时)
    Access violation at address 77f99ef8 in module "ntdll.dll" Write of address 002820f8
      

  3.   

    1 确定use了windows单元,或者自己写了api得申明
    2 用dependence看看dll文件的接口/导入/导出是否正确
    3 什么错误
      

  4.   

    larger中的windir,并没有分配内存
    用GetMem(windir,128);
      

  5.   

    function Larger (Val1, Val2: integer): pchar; stdcall;
    var
    windir:pchar;
    begin
    GetMem(windir, 128);//分配内存
    GetWindowsDirectory(windir,128); //获得安装目录
    if Val1 > Val2 then
    result := windir
    else if Val2 > Val1 then
    result := windir
    else
    result := 'hello';
    FreeMem(windir, 128);//释放内存
    end;