假设我正在开发一个安装COM组件的应用程序,安装程序会注册它们.这非常有效.
现在该软件需要从记忆棒运行.如何注册库运行时并确保在运行应用程序后清理注册表?
我有一个用C++编写的32位ActiveX控件.当尝试使用64位机器上的aximp将其导入.Net应用程序时,它会给出AxImp错误:未在'xxx.dll'中找到已注册的ActiveX控件.即使在该控件上运行regsvr32后,我也会遇到相同的错误.
还有另一个用C++编写的32位ActiveX控件,AxImp运行时没有问题.
还有一个测试 - 尝试将它的引用添加到示例.Net应用程序和VS 2k5引发此错误 - 无法添加对"xxx.dll"的引用.请确保该文件是可访问的,并且它是有效的程序集或COM组件.
但是添加了另一个控件没有问题.并且在引用中创建了AxXXXLib.dll.
怎么会有问题呢?
谢谢Sid
我使用ATL向导在Visual Studio 2008中创建了一个新的简单COM对象.该对象具有单个类和简单方法.ATL向导.rgs为我的班级生成了-files.
当我regsvr32 Simple.dll在我的XP机器上运行时,该类已注册,信息显示HKCR\Simple.SimpleObject在HKCR\CLSID\{guid}我预期的内部和内部.
但是,在我的64位Windows 7机器上它并不相同.我以管理员身份运行regsvr32 HKCR\Simple.SimpleObject显示部件.但是这部分 HKCR\CLSID永远不会到达那里.因此我无法创建新实例.(绝望的我在System32和SysWOW64中都尝试了regsvr32,效果相同.)
为什么不regsrv32把数据放入 HKCR\CLSID?
我正在尝试注册一些 DLL 作为我的安装程序的一部分。我正在使用该regserver标志,它对于大多数 DLL 都适用。但是,有一个 DLL 无法注册。它尝试加载其他 DLL,如果在当前目录中找不到它们,则会失败。如果从 {app} 目录手动运行 regsvr32,它会干净地注册。
有什么方法可以设置 regserver 标志的工作目录吗?还是整个安装程序?
现在,我正在通过一个[Run]条目来解决这个问题:
[Run]
;Register components that are "special"
Filename: "{sys}\Regsvr32.exe"; Parameters: "/s Awkward.dll"; \
WorkingDir: "{app}"; StatusMsg: "Registering components ... "; \
Flags: runhidden;
Run Code Online (Sandbox Code Playgroud)
但这并不理想,因为我怀疑我还应该添加一个[UninstallRun]部分并添加一个取消注册命令。我希望我能做到:
[Files]
Source: "{#mysrc}\Awkward.dll"; DestDir: "{app}"; Flags: regserver; \
WorkingDir: "{app}"
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法从特定目录注册/取消注册?
我想构建一个DLL类库使用COM Interop,使用C#,目标ANY CPU,并将其注册为32位和64位接口.
我希望能够在运行时显示使用的接口 - 如果我使用的是32位版本或64位版本.
有任何想法吗?
我们有一个遗留的 VB6 应用程序,它在启动时通过拉取最新文件并注册 COM 组件来更新自身。这适用于在另一台计算机上的 COM+ 中注册的本地 (regsvr32) ActiveX COM 组件和远程 (clireg32) ActiveX COM 组件。
出于安全原因,新要求阻止我们写入 HKEY_LOCAL_MACHINE (HKLM),这显然是调用 regsvr32 和 clireg32 时默认发生的情况。
我们提出了一种使用RegOverridePredefKey Windows API 方法在 HKEY_CURRENT_USER\Software\Classes (HKCU) 下注册本地 COM 组件的方法。这是通过将注册表中的插入重定向到 HKCU 位置来实现的。然后,当COM组件被实例化时,Windows首先查找HKCU,然后再在HKLM中查找组件信息。这取代了 regsvr32 正在做的事情。
我们此时遇到的问题是,当我们尝试使用clireg32注册VBR/TLB时,此注册过程还将注册键添加到HKEY_LOACL_MACHINE中。
有没有办法重定向 clireg32.exe 以注册组件为 HKEY_CURRENT_USER?是否有任何其他方法允许我们在安全访问受限的客户端计算机上注册这些 COM+ 组件?
目前我们唯一的解决方案是手动将注册信息写入注册表,但这并不理想,并且会成为一个维护问题。
我有一个.net程序集dll,我试图使用regsvr32注册,但得到以下错误:
"dll加载但未找到DllRegisterServer入口点"
注册其他dll时也会出现此错误.
我创建了一个类并使其可见:
[ComVisible(true)]
[Guid("FD909333-3CD0-477F-8A7E-B8045B0B84EC")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("TestComApp.TestApp.TestClass")]
public class TestClass:ITestCom
{
public int Add(int a, int b) { return a + b; }
}
Run Code Online (Sandbox Code Playgroud)
接口也设置为 COM 可见:
[ComVisible(true)]
[Guid("26567B41-15DB-4EE2-A277-357EAE96BF6A")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
interface ITestCom
{
int Add(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试注册 DLL 时
regsvr32 /i TestComApp.dll
Run Code Online (Sandbox Code Playgroud)
我收到以下错误“模块已加载,但未找到入口点 DLLRegisterServer”
我们已经在 docker 中部署了 .net 应用程序以及一些 COM 组件,但是当我们尝试使用 regsvr32 注册 COM dll 时,命令执行时没有任何错误。但是当我们在注册表中搜索CLS ID时却找不到。但我们仍然收到 CLSID {XXXX} 的组件检索 COM 类工厂失败的消息。
它是一个 32 位组件。并且在docker环境中也启用了32位。我们也尝试过提升访问权限,但没有成功
是否可以在docker中注册COM组件?
这里的人使用旧的编译的 VB 程序,最后一个版本已经有 16 年了。它可以在某些机器上运行,但不能在其他机器上运行,所有机器都具有相同的 1709 版本和 Windows 10 更新。
如果它不起作用,则会显示一条消息,说明该消息msdatlst.ocx或未msdatgrd.ocx注册。然后,当我尝试注册时,regsvr32 'MSDATGRD.OCX'会出现一条消息"the module was loaded but the entry-point was not found"。相同的命令在程序运行的机器上是成功的。
我确实在这里阅读了一些问题,但没有一个答案为我解决了这个问题。有任何想法吗?
regsvr32 ×10
com ×4
c# ×3
dll ×3
.net ×2
vb6 ×2
32bit-64bit ×1
64-bit ×1
clireg32 ×1
com+ ×1
dcom ×1
docker ×1
inno-setup ×1
installation ×1
interop ×1
ocx ×1
regfreecom ×1
registration ×1
windows ×1
windows-7 ×1
x86 ×1