小弟我编写了4个DLL文件,动态加载的时候开始还可以,但是后来就出现问题,总是报错,启动的时候就报错,project1.exe raised too many consecutive expections:'access violation at 0X00000000 : read of address 0X00000000'……
小弟我调试了半天也不能解决,请高手帮帮忙。

解决方案 »

  1.   

    小弟把握的部分代码帖上来:type
      TF_main = class(TForm)
      private
        { Private declarations }
         procedure MainClose;
      public
        { Public declarations }
      end;
      //动态调用DLL文件
      TShowOS = function (AHandle:THandle):String;StdCall; //获取操作系统信息界面
      TShowAbout = function (AHandle:THandle):String;StdCall; //获取软件说明
      Tgetdate = function :PChar;StdCall; //获取中文日期转换
      Ts_manage = procedure (Num:integer);StdCall;//获取系统管理操作代码
      Ts_tool = procedure (Num:integer);StdCall;//获取系统管理操作代码
    var
      F_main: TF_main;
      procedure ExitWin32Sys(iFlags: Integer);//执行注销、退出或重启系统的操作
      function SetPrivilege(sPrivilegeName: AnsiString; bEnable: Boolean): Boolean; //设置权限
      function GetSysTypes: Boolean;//获取操作系统类型
      procedure getdllmanage(Num:integer); //调用外来的sys_manage.dll文件的函数
      procedure getdlltool(aNum:integer); //调用外来的sys_tool.dll文件的函数
    implementation{$R *.dfm}
     
    procedure TF_main.A_system_infoExecute(Sender: TObject); //调用DLL文件显示系统信息
    var
      HOS:THandle;
      FPointer:TFarProc;
      MyFunct:TShowOS;
    begin
      HOS:=Loadlibrary('P_OSInfo.dll');
      try
      if HOS>32 then
      begin
        FPointer:=GetProcAddress(HOS,'ShowOS');
        MyFunct:=TShowOS(FPointer);
        MyFunct(Application.Handle);
      end;
      finally
        FreeLibrary(HOS);
      end;
    end;procedure TF_main.A_tool_searchExecute(Sender: TObject);
    begin
      getdlltool(1);
    end;procedure TF_main.A_tool_regeditExecute(Sender: TObject);//打开注册表
    begin
      getdlltool(2);
    end;procedure TF_main.A_system_timeExecute(Sender: TObject);//显示系统时间
    begin
      getdllmanage(3);
    end;procedure TF_main.A_system_controlExecute(Sender: TObject);//显示控制面板
    begin
      getdllmanage(2);
    end;procedure TF_main.A_system_soundExecute(Sender: TObject);//打开系统自带的音量控制模块
    begin
      getdllmanage(4);
    end;procedure TF_main.A_note_openExecute(Sender: TObject); //打开指定位置的记事本
    begin
      if OpenDialog1.Execute then
        WinExec(PChar('notepad.exe "' + OpenDialog1.FileName + '"'), SW_SHOW);
    end;procedure TF_main.A_note_createExecute(Sender: TObject); //新建记事本
    begin
      WinExec('notepad.exe',SW_SHOW);
    end;procedure TF_main.A_tool_calcExecute(Sender: TObject); //打开系统自带的计算器
    begin
      getdlltool(0);
    end;procedure TF_main.A_CDRom_closeExecute(Sender: TObject); //关闭光驱
    begin
      mciSendString('set cdaudio door closed wait',nil,0,handle);
    end;procedure TF_main.A_CDRom_openExecute(Sender: TObject); //打开光驱
    begin
      mciSendString('set cdaudio door open wait',nil,0,handle);
    end;procedure TF_main.A_tool_paintExecute(Sender: TObject); //打开画图板
    begin
      getdlltool(4);
    end;procedure TF_main.A_tool_magnifyExecute(Sender: TObject);//放大镜
    begin
      getdlltool(6);
    end;procedure TF_main.A_tool_keyboardExecute(Sender: TObject); //屏幕键盘
    begin
      getdlltool(3);
    end;procedure TF_main.A_system_manageExecute(Sender: TObject); //资源管理器
    begin
      getdllmanage(0);
    end;procedure TF_main.A_system_backupExecute(Sender: TObject); //系统备份
    begin
      getdllmanage(1);
    end;procedure TF_main.A_tool_recExecute(Sender: TObject); //录音机
    begin
      getdlltool(5);
    end;procedure TF_main.A_aboutExecute(Sender: TObject); //关于软件说明
    var
      HAbout:THandle;
      FPointer1:TFarProc;
      MyFunct1:TShowAbout;
    begin
      HAbout:=Loadlibrary('P_about.dll');
      try
      if HAbout>32 then
      begin
        FPointer1:=GetProcAddress(HAbout,'ShowAbout');
        MyFunct1:=TShowAbout(FPointer1);
        MyFunct1(Application.Handle);
      end;
      finally
        FreeLibrary(HAbout);
      end;
    end;procedure TF_main.FormShow(Sender: TObject);
    var
      HGD:THandle;
      FPointer2:TFarProc;
      MyFunct2:Tgetdate;
    begin
      HGD:=LoadLibrary('P_date.dll');
      try
        if HGD>32 then
        begin
          FPointer2:=GetProcAddress(HGD,'getdate');
          MyFunct2:=Tgetdate(FPointer2);
          statusbar1.Panels[0].Text:=MyFunct2; //调用P_date里面的关于日期汉字化的函数
        end;
      finally
          FreeLibrary(HGD);
      end;
    end;procedure getdllmanage(Num:integer);  //该函数动态调用sys_manage.dll文件,完成系统工具调用
    var
      HGDM:THandle;
      FPointer3:TFarProc;
      MyFunct3:Ts_manage;
    begin
      HGDM:=LoadLibrary('sys_manage.dll');
      try
        if HGDM>32 then
        begin
          FPointer3:=GetProcAddress(HGDM,'s_manage');
          MyFunct3:=Ts_manage(FPointer3);
          MyFunct3(Num);
        end;
      finally
          FreeLibrary(HGDM);
      end;
    end;procedure getdlltool(aNum:integer);  //该函数动态调用sys_tool.dll文件,完成系统工具调用
    var
      HGDT:THandle;
      FPointer4:TFarProc;
      MyFunct4:Ts_tool;
    begin
      HGDT:=LoadLibrary('sys_tool.dll');
      try
        if HGDT > 32 then
        begin
          FPointer4:=GetProcAddress(HGDT,'s_tool');
          MyFunct4:=Ts_tool(FPointer4);
          MyFunct4(aNum);
        end;
      finally
        FreeLibrary(HGDT);
      end;
    end;
    end.
      

  2.   

    别用AnsiString(string)作为DLL接口类型AnsiString的内存管理是编译帮助管理的
    DLL和APP使用内存有一个原则:谁分配谁释放。
    使用AnsiString会破坏这个原则
    可以改称ShortString
    获知通过PChar获得,可以参考标准API的封装
    GetClassName()、GetWindowText()
      

  3.   

    问题解决了,多谢zswang(伴水清清)(专家门诊清洁工),结帖了