在dll里面是这样的:function ABCC(aaa:string):string;
begin
 //   application.Initialize;
    result:=aaa+'***';
end;exports
    ABCC;
begin
在主窗口是这样写的:
function  ABCC(aaa:string):string;stdcall external 'c:\dllpro.dll';
procedure TForm1.Button1Click(Sender: TObject);
type
  TABCC=function(aaa:string):string;stdcall;
var
  mw:HWND;
  mt:TABCC;
  str:string;
begin
  mw:=loadlibrary('c:\dllpro.dll');
  if mw<>0 then
  try
    mt:=Getprocaddress(mw,'ABCC');
    if assigned(mt) then
      str:=mt('haha');
   // edit1.Text:=str;
  finally
    FreeLibrary(mw);
  end;
end;
 但是我在跟踪到运行到:FreeLibrary(mw);这里的时候就出错了.
到底什么问呢。请帮帮菜鸟

解决方案 »

  1.   

    首先,DLL的接口不能使用String类型,必须为PChar的http://lysoft.7u7.net
      

  2.   

    谢谢.
    1 但是如果是procedure过程.去掉sharemem就可以运行.如果增加也可以运行但是退出的时候就会提示出错.2 如果是function的话。必须要sharemen,运行可以.但是退出就是出错.不知道为什么.
    我测试结果.DELPH6下
    我再试试pchar.看看。
      

  3.   


        FreeLibrary(mw);去掉这个.再去掉sharemem就可以了。但是为什么呢.
    很是奇怪.如果是过程procedure 怎么测试跟我前面的反过来了呢
      

  4.   

    Dll单元导出的函数也要加装饰符 stdcall。
      

  5.   

    楼主学了个一知半解
    0.function ABCC(aaa:string):pchar; //最好用PCHAR1.function ABCC(aaa:string):string;  Stdcall;  //调用方式,要么都加,要么都不加 2.function  ABCC(aaa:string):string;stdcall external 'c:\dllpro.dll';  //静态调用  -------------------------------------------
      procedure TForm1.Button1Click(Sender: TObject);
      type
      TABCC=function(aaa:string):string;stdcall;  //动态调用  3procedure TForm1.Button1Click(Sender: TObject);
    type
      TABCC=function(aaa:string):string;stdcall;
    var
      mw:HWND;
      mt:TABCC;
      str:string;
    begin
      //查找DLL 
      mw:=loadlibrary('c:\dllpro.dll');
      //如果存在
      if mw<>0 then  
      try
        //查找函数
        @mt:=Getprocaddress(mw,'ABCC');  //最好加上@
        //如果函数存在
        if assigned(@mt) then
          str:=mt('haha');  //调用函数
       // edit1.Text:=str;
      finally
        FreeLibrary(mw);
      end;
    end;
      

  6.   

    function GetRedMoon(): Longint;
    var
      hRedMoon: THandle;
      MyRedMoon: TRedMoon;
    begin
      hRedMoon := LoadLibrary('RsDanyueer.dll');
      try
        if hRedMoon = 0 then
          Result := -1
        else
        begin
          @MyRedMoon := GetProcAddress(hRedMoon, 'RedMoon');
          if not (@MyRedMoon = nil) then
          begin
            Result := MyRedMoon;
          end
          else
            RaiseLastWin32Error;
        end;
      finally
        FreeLibrary(hRedMoon);
      end;
    end;