试过了,在下面二个方式,调用EXE,均能显示。
shellexecute(ServerFrm.handle,'open',pchar(D:\养老机构数据管理_Client\StartOH.exe),nil,nil,sw_shownormal);
WinExec('D:\养老机构数据管理_Client\StartOH.exe',sw_normal);
 

解决方案 »

  1.   

    正常可以执行,但是是在另外的会话中.
    想在当前用户桌面中执行比较麻烦.做过这个.要获取当前用户的token.然后复制一个,再用CreateProcessAsUser来创建进程
      

  2.   

    lyhoo163你好,你的程序如果在xp下可以显示,但是在win7无法显示。
    wr960204你好,有api可以获取user,有什么办法可以显示到当前的桌面上吗?
      

  3.   

    我前几天刚发的 http://bbs.csdn.net/topics/390954446
      

  4.   

    jjwandjy,非常感谢你,我研究一下
      

  5.   

    赞同  武稀松  说法。  贴段代码,未测试哦
    procedure CreateNewProcess;
    var
      CmdLine: AnsiString;
      ErrorCode: Cardinal;
      ConnSessID: Cardinal;
      Token: Cardinal;
      App: AnsiString;
      FProcessInfo: _PROCESS_INFORMATION;
      FStartupInfo: _STARTUPINFOA;
    begin
      ZeroMemory(@FStartupInfo, SizeOf(FStartupInfo));
      FStartupInfo.cb := SizeOf(FStartupInfo);
      FStartupInfo.lpDesktop := nil;  ConnSessID := WTSGetActiveConsoleSessionId;  if WTSQueryUserToken(ConnSessID, Token) then
      begin
        if CreateProcessAsUser(Token, PAnsiChar(App), PAnsiChar(CmdLine),
          nil, nil, false, 0, nil, nil, FStartupInfo, FProcessInfo) = False
        then
        begin
          ErrorCode := GetLastError;
          try
            RaiseLastOSError(ErrorCode);
          except on E: Exception do
            EventLog.LogError(e.ClassName +': '+ e.Message);
          end;
        end;
      end;
    end;