在vista环境下用shellAPI,运行regsvr命令发现ocx不能注册,
vista必须要设置“关闭UAC用户帐户控制方法”才能注册。能否不需要用这个方法就能注册ocx呢?不知道大家是怎么做的,请指点!

解决方案 »

  1.   

    目前为止也只有这个办法,当然也可以用Shellexecute指定管理员身份运行cmd,然后执行注册命令。
      

  2.   

    Shellexecute 需要“关闭UAC用户帐户控制”吗?
      

  3.   

    我只知道类似这样的用法:
    ShellExecute(Handle, nil, 'regsvr32.exe', 'flash.ocx', nil, SW_SHOWNORMAL);gyk120能否告诉具体怎么做?
      

  4.   

    我的意思是Shellexecute指定管理员身份运行Cmd,在cmd当中输入命令注册
    ShellExecute(0, // owner window
                   L"runas",
                   L"C:\\Windows\\cmd.exe",
                   0, // params
                   0, // directory
                   SW_SHOWNORMAL);
      

  5.   

    但在vista下,直接cmd运行regsvr32 "d:\flash.ocx" 命令都是不行的呀。必须关闭UAC才行,在程序中运行cmd命令可以?我试试吧。
      

  6.   

    cmd需要管理员权限运行才能注册成功,上面是个提权的代码,以管理员身份运行程序
      

  7.   

    gyk120兄弟:
       S := '"' + ExtractFilePath(ParamStr(0)) + flash.ocx"';
       ShellExecute(0, 'runas', 'C:\Windows\System32\cmd.exe ', PChar(' /C regsvr32.exe ' + S), nil, SW_SHOWNORMAL);

           
       请指教哪里错了,这样会报loadlibrary错误。
      

  8.   

    直接LoadLibrary那个OCX,然后调用其中的DllRegisterService就ok了。
      

  9.   

    ccrun: 你的方法我测试了,只能在XP下是可行的,在vista不可以的。
      

  10.   

    gyk120:还在线吗?
    我刚才是参考http://www.vista123.com/html/5189.html,不知道哪里做的有问题?  S := ' " ' + ExtractFilePath(ParamStr(0)) + flash.ocx" '; 
      ShellExecute(0, 'runas', 'C:\Windows\System32\cmd.exe ', PChar(' /C regsvr32.exe ' + S), nil, SW_SHOWNORMAL); 
          
      

  11.   

    测试发现竟然还有这样:
    在vista上述程序是可以执行的,但在XP下是报错的,开发环境是XP。
    真让我哭笑不得。
      

  12.   

    实在不行就用这个方法(转):
    操作步骤如下: 
    1.建立 res 文件 
    建立一个文本文件,名字可以自己起,我这里叫:UAC.manifest,内容: 
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
    <requestedPrivileges> 
    <requestedExecutionLevel level="requireAdministrator"/> 
    </requestedPrivileges> 
    </security> 
    </trustInfo> 
    </assembly>建立文本文件,名为 UAC.rc,内容: 
    1 24 UAC.manifest 
    编译成 uac.res 文件,运行: 
    brcc32 uac.rc -fouac.res 
    2.在代码中引入 
    打开项目文件,加入 
    {$R uac.res} 
    3.编译程序 
    这时程序就支持 VISTA 了,在运行的时候,会弹出 WINDOWS 的提示框,询问用户是否允许以管理员身份运行。我验证过这个方法可行,但每次都会弹出提示框,能否只提示一次,以后都按照管理员身份运行呢?
      

  13.   

    那个S的赋值好像有点问题,其他的我就看不出来了
    你把PChar(' /C regsvr32.exe ' + S)这一行单独写成一行试试,还有运行时候报什么错?不能loadlibrary还是loadlibrary出现读取错误
    楼上那也是个办法,不过XP下兼容性好像不怎么好
      

  14.   

    xp下loadlibrary出现错误,vista正确的,可以进行注册。
      

  15.   

    看来还是这个问题……
    至今为止有三种方法,都是Vista下可以成功运行,XP下报错,要解决的话恐怕要麻烦点,先获得Windows版本号,根据XP和Vista采用不同的方法,或者开发一个for XP和for Vista两个版本的
      

  16.   

    呵呵,gyk120我现在就是这么做的,谢谢你的指导!
      

  17.   

    XP下应该是由于Shell32.dll当中的某些函数储存位置变了,地址不同,调用的时候找不到
      

  18.   

    謝謝
    在windows\system32\CMD.EXE 以管理員權限運行後,運行 regsvr32 D:\OVFW.OCX
    成功了,圖像也出來了。哈哈