为什么程序开机自动启动会出现动态连接库函数调用异常

wsalvin 2006-04-28 05:17:39
求救大虾呀!

我的程序中调用了一个动态连接库的函数,手动启动正常.
但是,开机自动启动该程序时发现该函数调用异常.
我使用的是动态加载的方式调用.(静态的试过了,也一样)
调试信息中都显示了加载成功. 这个动态连接库是另一个人写的.

很奇怪的问题,我百试不得其解, 555....
请高人指点一下.问题到底出在哪里?
...全文
270 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fbwt 2006-05-06
  • 打赏
  • 举报
回复
这是因为你从"启动"中启动你的应用程序,所以导致当前的目录GetCurrentDir不是程序所在的目录,而是C:\Documents and Settings\Administrator\...

所以,你们需要在程序启动的时候,设置一次当前目录(调用SetCurrentDir API),你可以通过得到自己应用程序的路径的方式来得到这个目录的路径.
newfang 2006-05-03
  • 打赏
  • 举报
回复
ExtractFilePath(Application.exename) + dll\***.dll
infuse 2006-05-02
  • 打赏
  • 举报
回复
有次用VB写一个程序,快捷方式没有填工作路径,运行时有时会突然跳出.
相同程序在不同机器里会出现这种情况.
还有种情况就是,动态库和程序在同一目录,使用相对路径的话,有的机器显示找不到文件.复制到system32目录下就可以了.
infuse 2006-05-02
  • 打赏
  • 举报
回复
程序启动时,加个ChDir('当前目录');

Windows程序有时会出现这个问题,而且有时莫名其妙.
oosmile 2006-05-02
  • 打赏
  • 举报
回复
const
DLLFILE = '.\DLL\FILENAME.dll';//你程序的绝对路径就好了
//有的时候快捷方式也会影响相对路径的位置

type

TDllFunction = function (argv:Pchar):integer;stdcall;
...
var

LibAddr:THandle;
OpenFunc:TDllFunction;
...
procedure InitSSLVPNLib;
begin
LibAddr:=LoadLibrary(Pchar(OPENVPNDLL));
if LibAddr<>0 then
@OpenFunc:=GetProcAddress(LibAddr,'open_vpn');
end;
数字蛋糕 2006-05-02
  • 打赏
  • 举报
回复
在你的程序启动的时候运行一下ShowMessage(GetCurrentDir);就明白了。
wsalvin 2006-04-30
  • 打赏
  • 举报
回复
没有错

ParamStr(0) 是程序文件的绝对地址
"AutoRun" 是我传递给程序的命令行参数
wsalvin 2006-04-29
  • 打赏
  • 举报
回复
复制到启动菜单,运行正常;但是,写注册表方式不行

类似如下相关代码 :

Reg:=TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', True);
Reg.WriteString('MY_PROGRAM_NAME','"' + ParamStr(0) + '"'+' AutoRun');
AutoRun:=True;
Reg.CloseKey;
finally
Reg.Free;
end;

postren 2006-04-29
  • 打赏
  • 举报
回复
怎么开机启动的?复制到启动菜单了?

在启动菜单创建一个快捷方式应该问题不大,但你要是复制到了启动菜单,则出现相对路径不正确
wsalvin 2006-04-29
  • 打赏
  • 举报
回复
动态连接库 的路径问题我也考虑过.
还是又试了一下,问题依然存在.

奇怪的是那个函数调用时,没有跳出异常信息.只有通过捕捉采发现有异常.

如:
try
//函数调用语句
except
showmessage('DLL函数调用异常');
end;
wudi_1982 2006-04-29
  • 打赏
  • 举报
回复
Reg.WriteString('MY_PROGRAM_NAME','"' + ParamStr(0) + '"'+' AutoRun');

这里好像不对啊。。
wudi_1982 2006-04-28
  • 打赏
  • 举报
回复
dll复制到windows\system32或者跟你的程序同一个目录下。
或者你不用相对路径试一下。
数字蛋糕 2006-04-28
  • 打赏
  • 举报
回复
使用相对路径并不保险,因为你的程序启动时的工作路径不一定是它文件所在的路径。
用我的方法试试看吧
wsalvin 2006-04-28
  • 打赏
  • 举报
回复
我用的是相对路径
const
DLLFILE = '.\DLL\FILENAME.dll';

type

TDllFunction = function (argv:Pchar):integer;stdcall;
...
var

LibAddr:THandle;
OpenFunc:TDllFunction;
...
procedure InitSSLVPNLib;
begin
LibAddr:=LoadLibrary(Pchar(OPENVPNDLL));
if LibAddr<>0 then
@OpenFunc:=GetProcAddress(LibAddr,'open_vpn');
end;

然后再其它地方调用
xjb2001 2006-04-28
  • 打赏
  • 举报
回复
应该是 DLL 的路径问题,你 LOAD 的时候,看一下 DEBUG 就什么都知道了
数字蛋糕 2006-04-28
  • 打赏
  • 举报
回复
可能是未指定dll路径。试试把dll复制到windows\system32或者跟你的程序同一个目录下。
wsalvin 2006-04-28
  • 打赏
  • 举报
回复
Up一下

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧