【问题标题】:TResourceStream not working if I run my application from another using shellExecute如果我使用 shellExecute 从另一个运行我的应用程序,TResourceStream 将不起作用
【发布时间】:2016-06-25 14:59:53
【问题描述】:

我有两个应用程序,每个人都执行不同的任务,第一个应用程序使用 shellExecute 运行第二个应用程序。

ShellExecute(Handle, nil, PChar('D:\Project2.exe'), nil, nil, SW_SHOWNORMAL);
ShellExecute(Handle, nil, PChar('cmd.exe'), PChar('/C D:\Project2.exe'), nil, SW_SHOWNORMAL);

第二个应用程序提取其中已存在的资源。

问题是:当我从第一个应用程序运行第二个应用程序时,资源没有提取虽然申请表显示给我,但是如果我直接运行第二个“双击”提取的资源!

我也试过CreateProcessWinExec,资源也没有提取出来!!

编辑: project1 有一个按钮只打开 project2

procedure TForm1.Button1Click(Sender: TObject);
begin
    ShellExecute(Handle, nil, PChar('D:\Project2.exe'), nil, nil, SW_SHOWNORMAL);
end;

这是project2代码,必须在创建部分提取资源!

procedure TForm1.FormCreate(Sender: TObject);
var
  DllRS: TResourceStream;
begin
    DllRS:= TResourceStream.Create(HInstance, 'dllFile', 'dll');
    try
      DllRS.SaveToFile(GetCurrentDir + '\dllFile.dll');
    finally
      DllRS.Free;
    end;
end;

【问题讨论】:

  • 虽然您没有显示实际代码,但我会说这是通常的工作目录问题。
  • 您的程序有缺陷。只有知道代码的人才能修复它。
  • @FreeConsulting 调用进程的工作目录对TResourceStream 没有任何影响。 TResourceStream 失败的唯一方法是将错误的HInstance 传递给其构造函数(假设传递了正确的资源 ID/名称)。
  • @FreeConsulting OP 没有说明正在使用的文件系统。
  • @FreeConsulting 可能正在提取到内存,而不是文件。

标签: delphi resources delphi-xe7


【解决方案1】:

问题已解决, 我使用GetCurrentDir 获取project2 目录,如果我使用ShellExecute 从preject1 打开project2,GetCurrentDir 函数获取project1 目录而不是project2 !!!!!!

我使用ExtractFilePath(Application.ExeName) insted of GetCurrentDir,它工作正常!

所以,问题不在TResourceStream,而是在GetCurrentDir

【讨论】:

    【解决方案2】:

    我能想到的唯一合理的解释是第一个应用程序已经加载了第二个应用程序试图编写的 DLL。加载可执行文件(.exe、.dll、.ocx 等)后,该文件将被锁定且无法写入。

    【讨论】:

    • 好吧,你可以这么说,我在 project1 中使用 shellExecute 打开 project2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    相关资源
    最近更新 更多