我最近开始将.NET应用程序迁移到Windows Azure云服务.我们的应用程序严重依赖于许多COM类组件,其中包括AspPDF(用于PDF生成和操作)和AspJPEG(用于图像重新调整大小).在典型的非云IIS设置中,我只会在我们的生产服务器上注册DLL(使用regsvr32),一切都会好的!
在Azure中,这个过程略有不同,我将回答我自己的问题,以帮助那些面临类似挑战的人.此方法可用于需要在部署过程中在服务器上注册的任何dll.
我有一个DLL和OCX包然后我决定制作一个安装程序.
这就是我所拥有的:
ArchitecturesInstallIn64BitMode=x64
[Files]
Source: {syswow64}\*; DestDir: {syswow64}; Flags: onlyifdoesntexist
Source: {sys}\*; DestDir: {sys}; Flags: onlyifdoesntexist
[Run]
Filename: regsvr32.exe; Parameters: """{sys}\zlib1.dll"" /S"; StatusMsg: Registrando: zlib1.dll; Flags: RunHidden WaitUntilTerminated
Filename: regsvr32.exe; Parameters: """{syswow64}\actskin4.ocx"" /S"; StatusMsg: Registrando: actskin4.ocx; Flags: RunHidden WaitUntilTerminated
Filename: regsvr32.exe; Parameters: """{syswow64}\Bassmod.dll"" /S"; StatusMsg: Registrando: Bassmod.dll; Flags: RunHidden WaitUntilTerminated
Filename: regsvr32.exe; Parameters: """{syswow64}\ChamaleonButton.ocx"" /S"; StatusMsg: Registrando: ChamaleonButton.ocx; Flags: RunHidden WaitUntilTerminated
Filename: regsvr32.exe; Parameters: """{syswow64}\Codejock.Calendar.v13.4.0.Demo.ocx"" /S"; StatusMsg: Registrando: Codejock.Calendar.v13.4.0.Demo.ocx; Flags: RunHidden WaitUntilTerminated
Filename: regsvr32.exe; Parameters: """{syswow64}\Codejock.Codejock.TaskPanel.v13.4.0.Demo.ocx"" /S"; StatusMsg: Registrando: Codejock.Codejock.TaskPanel.v13.4.0.Demo.ocx; …Run Code Online (Sandbox Code Playgroud) 我试图让我们的构建脚本(使用MSBuild)在Vista上正常工作,并且我发现将注册输出(在链接器选项中)选项设置为True的项目无法从命令行构建,如下所示:
项目:错误PRJ0050:无法注册输出.请尝试启用每用户重定向或使用提升的权限从命令提示符注册该组件.
虽然我可以轻松地为一台机器修复此问题,但可以通过运行管理员或任何我希望构建脚本为任何开发机器"正常工作".
即使刚刚注册失败但是继续构建也会令人满意.有什么建议?
布拉德
我想在cmd窗口中使用regsvr32注册一个dll.我在管理员帐户上执行此操作,但我需要为所有用户注册此dll.原来regsvr32不这样做,它只为你当前的用户注册.好吧,当你以这种方式使用它时:"regsvr32/i"C:\ MyDll.dll""会发生什么; 该条目将添加到注册表中的Local_User和Classes,但不会添加到Local_Machine.
regsvr32上的msdn文章说使用/ i选项时它也需要[cmdline].但该文章没有说明我可以代替[cmdline].谷歌也拒绝帮助我,所以我有点坚持这一点.
我意识到这不完全是关于编程的主题,但这是程序员可能知道的,所以......有没有人遇到过这个问题?也许有人知道这个[cmdline]标签是如何工作的?有没有其他方法可以将此dll添加到所有用户?(除了手动编辑注册表.)任何见解将不胜感激!
我在尝试注册DLL时遇到问题.我的操作系统是Windows 7(x64).
我以两种不同的方式做到这一点:
1)使用regsvr32.我收到消息"DllRegisterServer ... succeedeed",但我在注册表中找不到我的CLSID.(并且我在尝试使用此CLSID创建组件实例时出现"Class not registered"错误.)在这种情况下,我知道DllRegisterServer从未被调用(因为我在此函数的开头创建了一个文本文件而它不是创建).
2)显式加载我的DLL并调用DllRegisterServer.在这种情况下,DllRegisterServer返回S_OK,但仍然无法在注册表中找到我的CLSID并获得"Class not registered"错误.
我确定代码是正确的(因为它不能仅在我的操作系统上运行),所以似乎问题出现在操作系统中.有人遇到过这样的问题吗?
我正在开发一个包含多个C++ COM Dll的遗留项目.每次在调试配置上构建解决方案时,构建过程都会为每个COM项目提供错误:
Error 10 error MSB3073: The command "
regsvr32 /s /c "D:\*****removed intentionally****_d.dll"
echo regsvr32 exec. time > ".\Debug\regsvr32.trg"
echo Server registration done!
:VCEnd
" exited with code -1073741819.
Run Code Online (Sandbox Code Playgroud)
我最近加入了这个项目,所以当我询问它时,我被告知每个人都会忽略这些错误,因为解决方案在第二个版本上成功构建.
我决定深入挖掘,似乎COM注册本身成功(这解释了为什么第二个版本没有重新尝试注册),但是对regsvr32的调用会返回错误代码(0xC0000005).这就是构建失败的原因.
我还试图从自定义构建步骤中删除注册,而是选择从链接器属性表"注册输出=是"注册,并得到相同的错误.
我尝试用其中一个dll调试regsvr32并找到以下内容:
我最初无法在DllRegisterServer中放置断点,然后我尝试调试regsvr32的X86版本(来自Windows\SysWOW64),然后才能在DllRegisterServer上中断.有人可以解释一下吗?
DllRegisterServer成功并返回S_OK.
DllRegisterServer返回后,抛出异常,并出现以下异常和堆栈跟踪:
regsvr32.exe中0x759849c1处的第一次机会异常:0xC0000005:访问冲突读取位置0x005bf028.
oleaut32.dll!_MemFree@4() + 0x25 bytes
oleaut32.dll!OLE_TYPEMGR::Release() + 0x1b138 bytes
oleaut32.dll!ReleaseAppData() + 0x317 bytes
oleaut32.dll!_OACleanup@0() + 0x5 bytes
ole32.dll!wCoUninitialize(COleTls & Tls, int fHostThread) Line 2830 C++
ole32.dll!CoUninitialize() Line 2620 C++
regsvr32.exe!_wWinMain@16() + 0xa77 bytes
regsvr32.exe!__initterm_e() + 0x1b1 bytes
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() …Run Code Online (Sandbox Code Playgroud) 我已经搜索过但没有找到任何答案。
该任务是使用 Powershell ps1 注册一个 dll,然后注册其他脚本行。我不想被对话框打断,所以添加了/s参数。但现在无论成功还是失败,结果信息都会被忽略。我希望结果显示在控制台中。但如何呢?
我有
在ADDRESS运行时错误216
注册使用Delphi XE2构建的64位dll时(我有更新3).
从命令提示符我做(注意:system32文件夹包含64位exe!)
c:\windows\system32\regsvr32.exe My64bitdll.dll
Run Code Online (Sandbox Code Playgroud)
在"dll成功安装消息"之后,我遇到了运行时错误.
我想以某种方式使用Run/Parameters/host来调试注册过程.
谁能发布正确的程序?在像这样的一些其他问题中提到了一个bug,但现在似乎已修复,我有一个比这个更早的delphi构建.
更新: 欢迎任何关于RunTime错误的评论.
我有一个第三方Web应用程序,它依赖于在用户计算机上注册的特定OCX文件.我以管理员身份进入计算机并使用以下命令注册该文件:
REGSVR32/S MyFile.ocx
这很好用,我可以毫无问题地使用Web应用程序.在注册表中,我可以看到控件已正确注册.
但是,当另一个用户登录到非管理员的计算机并尝试运行Web应用程序时,它不起作用.
如果我将该用户添加到管理员组并让他们运行REGSVR32命令,它可以正常工作.不幸的是,让我的所有用户成为他们机器上的管理员真的不可行.
有没有办法我可以用REGSVR32注册OCX文件并让所有用户都可以使用它,即使那些没有管理员权限的用户?
谢谢!
我编写了一个通过WIX生成的MSI分发的COM组件.
COM组件具有相当复杂和非静态的注册逻辑,这意味着直接在Windows Installer WXS文件中嵌入注册信息不是一个可行的选项 - 注册必须使用regsvr32- 并且它是一个32位的COM组件,所以它必须使用32位版本regsvr32.exe- %SystemRoot%\SysWow64\regsvr32.exe在64位Windows或%SystemRoot%\System32\regsvr32.exex86 Windows上.
我注意到WIX与这个WXS XML有两个问题:
<InstallExecuteSequence>
<Custom Action="COMRegister" After="InstallFinalize">NOT Installed</Custom>
<Custom Action="COMUnregister" After="InstallInitialize">Installed</Custom>
</InstallExecuteSequence>
<CustomAction Id="COMRegister" Directory="APPLICATIONROOTDIRECTORY" ExeCommand='regsvr32.exe /s "[APPLICATIONROOTDIRECTORY]Component.dll"' />
<CustomAction Id="COMUnregister" Directory="APPLICATIONROOTDIRECTORY" ExeCommand='regsvr32.exe /s /u "[APPLICATIONROOTDIRECTORY]Component.dll"' />
Run Code Online (Sandbox Code Playgroud)
regsvr32.exe引用了错误.我注意到x64版本resgvr32.exe是在64位系统而不是32位版本上运行的.regsvr32.exe在没有提升权限的情况下运行,因此COM注册失败E_ACCESSDENIED.对于1.它可以工作,如果我硬编码regsvr32.exe可执行文件的路径使用[WindowsFolder]\SysWOW64\regsvr32.exe,但这SysWow64不适用于不存在的真正的32位机器.
对于2.我在线阅读更改After="InstallFinalize" toAfter ="RemoveExistingProducts" would cause it to run with elevated permissions, however instead this just gives me errors aboutRemoveExistingProducts`是一个未解析的符号名称.
我该如何解决这两个问题?
(在过去2小时内遇到这个问题后,我确信WIX的作者是HP …