Windows 我如何从pascal程序运行odbcad32?

Windows 我如何从pascal程序运行odbcad32?,windows,delphi,lazarus,freepascal,Windows,Delphi,Lazarus,Freepascal,我正在尝试从Lazarus IDE中编写的程序运行odbcad32.exe(Windows 10,64位)。 我尝试以32和64位构建,但始终遇到以下文本的异常: 无法执行:740 显然,在谷歌搜索之后,这意味着我的程序需要管理员权限,但我是从管理员帐户运行它的。 我可以从桌面上的图标、控制台和用Delphi IDE编写的旧程序运行odbcad32(正常情况下,没有Windows关于权限的问题),但不能从Lazarus代码运行 那么我做错了什么? 程序必须是跨平台的。我将在Unix/OSX中运行

我正在尝试从Lazarus IDE中编写的程序运行odbcad32.exe(Windows 10,64位)。 我尝试以32和64位构建,但始终遇到以下文本的异常:

无法执行:740

显然,在谷歌搜索之后,这意味着我的程序需要管理员权限,但我是从管理员帐户运行它的。 我可以从桌面上的图标、控制台和用Delphi IDE编写的旧程序运行odbcad32(正常情况下,没有Windows关于权限的问题),但不能从Lazarus代码运行

那么我做错了什么? 程序必须是跨平台的。我将在Unix/OSX中运行其他程序

以下是源代码(“SMESE”是显示错误消息的过程):


在UAC下,管理员用户使用受限令牌运行。您需要明确要求使用完整的管理令牌运行进程。^^^换句话说,您必须将requestedExecutionLevel设置为
requireAdministrator
,向应用程序添加清单,以获取更多信息,或者使用
runas
动词而不是
open
,调用
ShellExecute
,使用管理员帐户登录与“以管理员身份”运行进程不同。谢谢大家。我完全忘记了UAC。尝试直接调用CreateProcess并获得相同的结果。我想,我必须对不同的操作系统使用条件指令,并在Windows中执行ShellExecute。我的应用不需要管理员权限,我只想让它运行odbcad32,如果允许用户运行的话。
uses SysUtils, Process;
...
function RunExe1(exefilename:string;var em:string):boolean;
var
   exe:TProcess;
   f:integer;
begin
     exe:=TProcess.Create(nil);
     exe.InheritHandles:=false;
     exe.Executable:=exefilename;
     for f:=1 to GetEnvironmentVariableCount do
       exe.Environment.Add(GetEnvironmentString(f));
     exe.Options:=exe.Options-[poWaitOnExit];
     try
        exe.Execute; // <--- Exception is raised here
        result:=true;
        em:='';
     except
       on e:exception do
       begin
         result:=false;
         em:=e.Message;
       end
     end;
     exe.Free;
end;
procedure Tselectdbw.odbcmanClick(Sender: TObject);
var
   em:string;
begin
     //if not RunExe1('C:\Windows\syswow64\odbcad32.exe',em) then smesse(em);
     //if not RunExe1('C:\Windows\system32\odbcad32.exe',em) then smesse(em);
     if not RunExe1('odbcad32.exe',em) then smesse(em);
end;
procedure ShellOpenFile(hWnd:HWND;filename:string);
begin
     shellexecute(hWnd,'open',
      pansichar(filename),nil,nil,SW_SHOW)
end;