小弟我编写了4个DLL文件,动态加载的时候开始还可以,但是后来就出现问题,总是报错,启动的时候就报错,project1.exe raised too many consecutive expections:'access violation at 0X00000000 : read of address 0X00000000'……
小弟我调试了半天也不能解决,请高手帮帮忙。
小弟我调试了半天也不能解决,请高手帮帮忙。
解决方案 »
- 询问正弦曲线求取高峰的算法,请教大家了
- 动态生成tcxsplitter控件后出现的问题
- 我想对文本文件中的信息进行读取,我这里没有相关资料可查,请高手帮助!!
- DsPack怎样Gif视频动态叠加?
- 请问在sql中如何将下列情况中的机号分别列出来
- 如果DBgrid中单元格为空,则用红色来表示,怎样写?
- delphi3下的自定义控件可否在DELPHI5或6或7上使用?
- 讨论:如何在DELPHI中写一个校验的函数
- 如何获得windows系统中各进程的句柄以及各进程中每个控件的句柄?
- 请问哪儿有128位的des算法,或者des控件也行,有运行程序最好(QQ:20866956)
- 兄弟们怎样在工作站上获得服务器的硬盘ID,CPU型号等(通过DELPHI的BDE或其他方式)?
- 如何像locate、findkey一样,定位到第N条记录(即数据集的RecNo为N),没有key、id
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.
DLL和APP使用内存有一个原则:谁分配谁释放。
使用AnsiString会破坏这个原则
可以改称ShortString
获知通过PChar获得,可以参考标准API的封装
GetClassName()、GetWindowText()