2

我有一个相当奇怪的问题:

我的程序使用 ShellExecuteEx 启动另一个程序。当我的程序独立运行时,这可以正常工作,但是当它从 Delphi IDE 启动时失败,其中“从 Delphi IDE 启动”意味着:

  • 运行 -> 运行(在调试器内)
  • 运行 -> 运行而不调试

ShellExecuteEx 返回 false 并且 RaiseLastOsError 导致以下错误消息:

System Error.  Code: -2146368396.
The COM+ registry database detected a system error.

同一个程序还有另一个问题,可能是由同一个问题引起的:TOpenDialog.Execute 和 TSaveDialog.Execute 方法不执行任何操作。没有显示对话框,函数返回 false。当程序单独运行时,这再次正常工作。通过谷歌搜索,我发现这也是一个与 COM 相关的问题。

我的程序不包含任何 COM 代码,只有 Delphi RTL/VCL 自动调用的那些函数。

我在 CoInitialize 和 CoInitializeEx 上放置了一个断点,发现只有一个来自 ComObj.InitComObj 的 CoInitialize 调用。那里似乎没有什么问题。

这是失败的代码:

function ShellExecEx(const Filename: string; const Parameters: string;
  const Verb: string; CmdShow: Integer; _ShowAssociateDialog: Boolean = False): boolean;
var
  Sei: TShellExecuteInfo;
begin
  FillChar(Sei, SizeOf(Sei), #0);
  Sei.cbSize := SizeOf(Sei);
  Sei.FMask := SEE_MASK_DOENVSUBST;
  if not _ShowAssociateDialog then
    Sei.FMask := Sei.FMask or SEE_MASK_FLAG_NO_UI;
  Sei.lpFile := PChar(Filename);
  if Parameters <> '' then
    Sei.lpParameters := PChar(Parameters)
  else
    Sei.lpParameters := nil;
  if Verb <> '' then
    Sei.lpVerb := PChar(Verb)
  else
    Sei.lpVerb := nil;
  Sei.nShow := CmdShow;
  Result := ShellExecuteEx(@Sei);
end;

// called as:
lEditorFilename := 'C:\Program Files (x86)\Notepad++\notepad++.exe';
lParameterStr := '"D:\source\EditorUi.dfm" -n1540';
if not ShellExecEx(lEditorFilename, lParameterStr, '', SW_SHOWNORMAL) then
  RaiseLastOSError;

这是一个在 Windows 8.1 64 位上运行的 32 位 Delphi XE2 程序。

任何提示可能导致这种情况?

编辑:

根据David Heffernan关于环境替换的问题,我删除了附加的环境变量

lang=de

我已经进入运行 - > 参数对话框来测试德语翻译。突然之间,上述两种效果都消失了。将其放回去,或仅添加任何环境变量(例如 test=test),即可可靠地复制它们。

怎么回事?

4

0 回答 0