在Excel VBA中调用没有COM互操作管理权限的regasm

Mic*_*zyk 11 com vba com-interop regasm excel-vba

此处描述了在没有管理员权限的情况下调用regasm的解决方法:

COM Interop没有regasm

我正在尝试创建一个COM库,我的用户可以在没有管理员权限的情况下从Excel VBA部署和使用它.我喜欢regasm解决方法,因为似乎人们在使用Excel VBA中的免注册COM对象方面没有太大成功.我也希望早期绑定,以便我的用户可以从语法完成中受益.

但是,上述问题中接受的答案并未描述将汇编dll放在用户计算机上的位置.管理员权限是在GAC中安装程序集所必需的,所以我想知道在哪里可以放置dll文件.我假设应用程序的目录正在搜索任何引用的dll,但我不能将我的dll放在Excel的目录中而没有管理员权限.是否可以使用Excel客户端的变通方法?有没有其他方法从VBA调用COM对象而不需要管理员权限来首先部署它们?

nos*_*tio 8

在没有COM互操作管理权限的情况下调用regasm

我认为应该可以使用RegistrationServices.RegisterAssemblyRegOverridePredefKeyAPI一起在HKCUUive 下以UAC友好的方式实现自动注册.我在这里发布了一个更详细的答案.

  • 我写了一个简单的C++/CLI控制台应用程序,它起作用了:`int main(array <System :: String ^> ^ args){HKEY key; Console :: WriteLine(RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software \\ Classes"),0,KEY_ALL_ACCESS,&key)); Console :: WriteLine(RegOverridePredefKey(HKEY_CLASSES_ROOT,key)); auto rs = gcnew RegistrationServices; rs-> RegisterAssembly(Assembly :: LoadFile("C:\\ lib-net.dll"),AssemblyRegistrationFlags :: SetCodeBase); 返回0; }` (3认同)

Han*_*ant 5

是的,现在有两个问题,您不能将其放在应该放置的位置,例如GAC或ac:\ program files子目录。由于这些位置也需要UAC提升。您可能还忘记了使用/ codebase选项运行Regasm.exe,这是告诉CLR在何处查找文件所必需的。

用户需要具有足够的特权才能将DLL复制到他具有写访问权的目录中。通常,这只是c:\ users \ username中的目录,例如appdata子目录。您必须解决的麻烦是,由于每个用户的用户名都不相同,因此需要为每个用户调整.reg文件。因此,CodeBase需要为每个用户更改.reg文件中的值。适度地说,这伸缩性很差。

您找到的答案不是一个很好的答案。唯一的解决办法真正的作品是写自己的注册功能。在HKCU而不是HKLM中写入注册表项的注册表项。使用[ComRegisterFunction]属性。您从.reg文件中知道您需要编写哪些键。然后,您使用Assembly.GetExecutingAssembly()。Location找出要为CodeBase注册表值写什么。不要忘记[ComUnregisterFunction]。

请记住,至少在精神上,您正在尝试绕过LAN管理员对这些用户施加的限制。他们确实非常关心知道哪种代码在他们支持的机器上运行。这很可能会给您带来麻烦,至少可以与该人交谈。