能力值:
( LV13,RANK:1370 )
|
-
-
2 楼
但是有一点,由于DLL中调用应用程序路径的语句用的是绝对路径,所以只能把PEDIY和DLL放在D盘根目录下。代码是这样的:
ShellExecute(0,nil,'d:\pediy.exe',PChar(sSaveFile),charSavePath,SW_NORMAL);
我试着将d:\pediy.exe改为相对路径,但始终没有成功。试了以下几种方法:
PathStr:=ExtractFilePath(Paramstr(0));
Strname:=pathstr+'diy.exe';
ShellExecute(0,nil,PChar(Strname),nil,nil,SW_NORMAL);
//WinExec(PChar(Strname), lpici.nShow);
--------------
PathStr:=GetCurrentDir;
Strname:=pathstr+'diy.exe';
ShellExecute(0,nil,PChar(Strname),PChar(sSaveFile),charSavePath,SW_NORMAL);
---------------
function GetDllPath(): PChar; //获取DLL路径
var
ModuleName: string;
begin
SetLength(ModuleName, 260);
GetModuleFileName(HInstance, PChar(ModuleName), Length(ModuleName));
result := PChar(ModuleName);
end;
ShellExecute(0,nil,'pediy.exe',PChar(sSaveFile),GetDllPath(),SW_NORMAL);
但是都不成功,希望高手能够解决。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
支持~~~~~~~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
貌似兄弟有两张图片顺序贴反了.....
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
不用这么麻烦,改一下注册表就关联了
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
不用这么麻烦,改一下注册表就关联了...... 大家都知的......
但上面的......顶啊......
|
能力值:
( LV9,RANK:190 )
|
-
-
7 楼
又一个经典PEDIY
|
能力值:
( LV9,RANK:330 )
|
-
-
8 楼
精彩,支持!
|
能力值:
( LV9,RANK:170 )
|
-
-
9 楼
0040128E 61 POPAD ; 恢复现场
0040128F |.^ EB B5 JMP SHORT pediy.00401246 ; 跳回到正常流程
和下面
004012B3 |. 60 POPAD ; 恢复现场
004012B4 ^ EB 90 JMP SHORT 00401246 ; 跳回到正常流程
感觉这里两个jmp short 00401246应该为00401264或者00401206才对
|
能力值:
( LV13,RANK:1370 )
|
-
-
10 楼
最初由 rockhard 发布 0040128E 61 POPAD ; 恢复现场 0040128F |.^ EB B5 JMP SHORT pediy.00401246 ; 跳回到正常流程
和下面 004012B3 |. 60 POPAD ; 恢复现场 ........
假如改为jmp 00401264或者00401206,按下菜单点确定后,程序将退出掉,jmp 00401246是重新跳到正常的界面,因为00401246是处理完对话框后跳往的路径,看下面的代码就知道:
00401218 |. FF15 44204000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
0040121E |. 33C0 XOR EAX,EAX
00401220 |. EB 24 JMP SHORT 00401246 ; 就是这里
|
能力值:
( LV9,RANK:170 )
|
-
-
11 楼
想了想,还是楼主的流程对.
因为响应了菜单操作,不应该再跑到DefWindowProc了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
这个东西好用吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
ShellExecute的第三个参数需要传入的是绝对路径,如果你需要省略路径,那么把
pediy.exe这个文件放入windows目录,传入参数时只给文件名就可调用了。
为什么放入windows目录就可以了,其实这里是一个全局环境变量起的作用(打开
一个console窗口,输入path,就可以看到当前的环境变量值)。函数会轮流搜索
这里的每一个值,改变这个环境变量值,加入一个新值D:\,调用ShellExecute传入
"pediy.exe"才会成功。
ExtractFilePath和GetCurrentDir这二个函数可能是Delphi的版本,我在MSDN上找
不到说明,不过我猜这二个函数返回的是进程的当前路径而不是DLL的路径。调用DLL
的进程是Explorer,所以你也要把pediy.exe放入和Explorer.exe相当的文件目录才
行。这二个函数的行为是不是和我说的一样,你输出这二个函数返回值看下吧。
GetModuleFileName我不知道Delphi的版本函数行为是怎么样的,不过在MSDN上的说
明函数返回的是一个包含文件名的完整路径,你把返回值直接拿来做为ShellExecute
的第5个参数,不正确吧?而且ShellExecute的这个参数是设计为进程运行后以这个
参数值为它的当前路径,但是你却认为这是指定加载时以这个路径找pediy.exe这个
文件,显然你理解错了它的意思。
最后,解决方法:
1、注册环境变量值(SetEnvironmentVariable),使用相对路径。
2、用了ExtractFilePath和GetCurrentDir这类函数,那么把pediy.exe文件放到调
用该DLL的程序目录下吧。
3、自己处理路径保证传入ShellExecute的是绝对路径。
Buddhat
|
能力值:
( LV13,RANK:1370 )
|
-
-
14 楼
我试着用GetCurrentDir的方法,还是不行,而这些方法用于VCL工程都是可行的??
PathStr:=GetCurrentDir();
Strname:= PathStr+'\'+'pediy.exe';
ShellExecute(0,nil,PChar(Strname),nil,nil,SW_NORMAL);
希望楼上的能解决一下.
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
绝对路径可用GetModuleFileName找到
|