我有一个相当奇怪的问题:
我的程序使用 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),即可可靠地复制它们。
怎么回事?