相关疑难解决方法(0)

无法从VBA获得免注册COM

更新:在花了20多个小时尝试使一个简单的示例工作之后,我意识到这并不像看起来那样简单。诸如此类的文章揭示了“陷阱”-它是在Windows 7之前编写的(处理清单的方式有所不同)。我坚持通过VSTO将.NET程序集暴露给VBA 。


我制作了一个简单的COM-Visible .NET程序集,并试图从Excel VBA中调用它。如果我在.NET构建过程中“注册COM Interop”,则可以从VBA成功调用它。

Sub VBA()    
    Dim obj As Object
    Set obj = actCtx.CreateObject("ComTest.Main")
    MsgBox obj.Test() '<-- Displays "Hello"
End Sub
Run Code Online (Sandbox Code Playgroud)

但是,我想免注册。

根据汉斯的建议更新:

我取消选中``注册COM Interop'',然后将我的app.Manifest设置为:

Sub VBA()    
    Dim obj As Object
    Set obj = actCtx.CreateObject("ComTest.Main")
    MsgBox obj.Test() '<-- Displays "Hello"
End Sub
Run Code Online (Sandbox Code Playgroud)

我创建了一个虚拟的“ client.manifest”,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly 
  manifestVersion="1.0" 
  xmlns="urn:schemas-microsoft-com:asm.v1" 
  xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
  xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <assemblyIdentity
    type="win32"
    version="1.0.0.0" 
    name="ComTest" 
    publicKeyToken="a36a7110110d7bd7" />

  <clrClass
      clsid="{975DC7E0-4596-4C42-9D0C-0601F86E3A1B}"
      progid="ComTest.Main"
      threadingModel="Both"
      name="ComTest.Main"
      runtimeVersion="v4.0.30319">
  </clrClass>

  <file name = "ComTest.dll"></file>   
</asmv1:assembly>
Run Code Online (Sandbox Code Playgroud)

创建对象时,我修改了VBA以使用client.manifest: …

.net vba com-interop regfreecom registration-free-com

7
推荐指数
1
解决办法
1773
查看次数

带有 VBA 延迟投标的 Python COM 服务器 + 跳过获胜注册(无管理员权限)

我正在尝试import在 VBA 中输入 Python 代码。

下面的代码有效,但需要管理员权限。有没有办法绕过 win register 需求(假设我只是没有管理员权限)但保持“延迟投标”行为(每次我编译新东西时都不想工具>>参考)

class ProofOfConcept(object):
    def __init__(self):
        self.output = []

    def GetData(self):
        with open('C:\Users\MyPath\Documents\COMs\SourceData.txt') as FileObj:
            for line in FileObj:
                self.output.append(line)
            return self.output

class COMProofOfConcept(object):
    _reg_clsid_ = "{D25A5B2A-9544-4C07-8077-DB3611BE63E7}"
    _reg_progid_= 'RiskTools.ProofOfConcept'
    _public_methods_ = ['GetData']

def __init__(self):
    self.__ProofOfConcept = ProofOfConcept()

def GetData(self):
    return self.__ProofOfConcept.GetData()

if __name__=='__main__':
    print "Registering COM server..."
    import win32com.server.register
    win32com.server.register.UseCommandLine(COMProofOfConcept)
Run Code Online (Sandbox Code Playgroud)

调用它的 VBA 代码:

Sub TestProofOfConcept()
    Set PoF = CreateObject("RiskTools.ProofOfConcept")
    x = PoF.GetData()
    MsgBox x(0)
End Sub
Run Code Online (Sandbox Code Playgroud)

python com vba winreg

1
推荐指数
1
解决办法
550
查看次数