2009-06-11 111 views
3

现在我非常忙于开发一个activex/com应用程序。我们的一些客户正在严格限制的Windows环境下工作。所以我决定让我的应用程序无regfree。我发现genman32.exe可以轻松地创建清单(也是有用的mt.exe)。一切都很好,但是当我试图因为应用程序的工作原理上的COM服务器 -Windows XP上的Microsoft.Windows.ActCtx

set o = CreateObject("Application.Interface") 

// No object reference 

执行从WSH(VBS或JS)我的应用程序 - 其有义务为我的情况,因为“创建对象”看起来到系统登录并没有注册条目:)然后我搜索并找到了“actctx”的东西。在dot.net环境中实现起来非常简单。但我必须执行从WSH(VBS或JS)我的应用程序;),所以我决定搜索了一下,然后发现

set o = CreateObject("Microsoft.Windows.ActCtx") 
o.manifest = "L:\\Application.dll.manifest" 
set app = o.CreateObject("Application.Interface") 
app.Launch() // which is my executing function 

问题 - “Microsoft.Windows.ActCtx”接口不能使用在Windows XP的机器甚至在SP3中 - 微软永远不会轻松 - 有没有解决这个问题的方法?你知道任何其他方法或创建该接口的Windows更新吗?

回答

1

如果Microsoft.Windows.ActCtx是可重新分发的,那么它将不得不通过某种方式进入机器并进行全局注册。如果您有权在计算机上注册该程序,您是不是可以直接注册Application.Interface?如果你在处理受限制的环境......那么你必须处理已有的东西。

看起来您正在使用wsh脚本来启动您的应用程序。为什么不写一个存根来启动应用程序在本地或托管代码(您将能够使用清单),并调用该存根?

3

我想出了我的清单问题。我将与任何可能遇到类似问题的人分享。

请注意,当您在“Microsoft.Windows.ActCtx”界面中使用此清单时,您必须在清单中指定progid =“”属性,否则您将获得ActiveX组件无法创建对象错误。

<comClass 
clsid="{ED59F192-EF2E-4BCC-95EB-85A8C5C65326}" 
progid="myclass.process" 
threadingModel = "Apartment" /> 

以下清单的例子应该让你和运行:)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
    manifestVersion="1.0"> 

<assemblyIdentity 
    type="win32" 
    name="myclass" 
    version="1.0.0.0"/> 

<file name = "myclass.dll"> 

<comClass 
    clsid="{ED59F192-EF2E-4BCC-95EB-85A8C5C65326}" 
    progid="myclass.process" 
    threadingModel = "Apartment" /> 

<typelib tlbid="{7AE20C3A-48C2-42C1-A68D-A1C3EB0A2C65}" 
     version="1.0" helpdir=""/> 

</file> 

<comInterfaceExternalProxyStub 
    name="_PROCESS" 
    iid="{187D0811-470D-44C0-B68C-C1C7F3EEFDA0}" 
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" 
    baseInterface="{00000000-0000-0000-C000-000000000046}" 
    tlbid = "{7AE20C3A-48C2-42C1-A68D-A1C3EB0A2C65}" /> 

</assembly>