shellexecute函数无法在如何提供管理员权限限启动的程序DLL中启动WINDOWS目录下的程序

  ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等)并对外部程序有一定的控制。

  有几个API函数都可以实现这些功能但是在大多数情况下ShellExecute是更多的被使用的,同时它并不是太复杂

  ShellExecute函数原型及参数含义如下:

  ●hWnd:用于指定父窗口句柄。当函數调用过程出现错误时它将作为Windows消息窗口的父窗口。例如可以将其设置为应用程序主窗口句柄,即’, NULL, NULL, SW_SHOWNORMAL);

  格式二:http://网站域名/网页文件洺

  /", NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)

  格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文

  在一个应用程序调用c:\为扩展名的MS-DOS程序或Windows程序必须包含.com扩展名。
  调用进程可鉯通过WaitForInputIdle函数来等待新进程完成它的初始化并等待用户输入这对于父进程和子进程之间的同步是极其有用的,因为 CreateProcess函数不会等待新进程完荿它的初始化工作举例来说,在试图与新进程关联的窗口之前进程应该先调用 WaitForInputIdle。
  首选的结束一个进程的方式是调用ExitProcess函数因为这個函数通知这个进程的所有动态链接库(DLLs)程序已进入结束状态。其他的结束进程的方法不会通知关联的动态链接库注意当一个进程调鼡ExitProcess时,这个进程的其他县城没有机会运行其他任何代码(包括关联动态链接库的终止代码)
  ExitProcess, ExitThread, CreateThread, CreateRemoteThread,当一个进程启动时(调用了CreateProcess的结果)昰在进程中序列化进行的在一段地址空间中,同一时间内这些事件中只有一个可以发生这意味着下面的限制将保留:
  *在进程启动囷DLL初始化阶段,新的线程可以被创建但是直到进程的DLL初始化完成前它们都不能开始运行。
  *在DLL初始化或卸下例程中进程中只能有一个線程
  *直到所有的线程都完成DLL初始化或卸下后,ExitProcess函数才返回
  在进程中的所有线程都终止且进程所有的句柄和它们的线程被通过調用CloseHandle函数终止前,进程会留在系统中进程和主线程的句柄都必须通过调用CloseHandle函数关闭。如果不再需要这些句柄最好在创建进程后立刻关閉它们。
  当进程中最后一个线程终止时下列的事件发生:
  *所有由进程打开的对象都会关闭。
  *进程的终止状态(由GetExitCodeProcess函数返回)从它的初始值STILL_ACTIVE变为最后一个结束的线程的结束状态
  *主线程的线程对象被设置为标志状态,供其他等待这个对象的线程使用
  *進程对象被设置为标志状态,供其他等待这个对象的线程使用
  假设当前在C盘上的目录是\MSVC\MFC且有一个环境变量叫做C:,它的值是C:\MSVC\MFC就像前媔lpEnvironment中提到过的那样,这样的系统驱动器上的目录信息在CreateProcess函数的lpEnvironment参数不为空时不会被自动传递到新进程里一个应用程序必须手动地把当前目录信息传递到新的进程中。为了这样做应用程序必须直接创建环境字符串,并把它们按字母顺序排列(因为Windows NT和Windows 95使用一种简略的环境变量)并把它们放进lpEnvironment中指定的环境块中。类似的他们要找到环境块的开头,又要重复一次前面提到的环境块的排序
  一种获得驱动器X的当前目录变量的方法是调用GetFullPathName("x:",..)。这避免了一个应用程序必须去扫描环境块如果返回的绝对路径是X:\,就不需要把这个值当作一个环境数據去传递了因为根目录是驱动器X上的新进程的默认当前目录。
  由lpcurrentDirectory参数指定的当前目录室子进程对象的当前目录lpCommandLine参数指定的第二个項目是父进程的当前目录。
SetConsoleCtrlHandler(NULL,True)的调用被用在新的进程上这意味着对新进程来说CTRL+C是无效的。这使得上层的外科程序可以自己处理CTRL+C信息并有选擇的把这些信号传递给子进程CTRL+BREAK依旧有效,并可被用来中断进程/进程树的执行
  第一个参数lpApplicationName可能是空,这种情况下可执行文件的名芓必须在lpCommandLine 中,lpCommandLine参数中可以包含空格如果可执行文件或路径中包含空格,那么就会有执行不正确文件的风险这是由于这个函数解析空格嘚方法引起的。例如:下边这个例子就很危险因为它试图运行/duck04551/archive//4312260.aspx

我要回帖

更多关于 如何提供管理员权限 的文章

 

随机推荐