2009-06-11 109 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>