2009-02-14 20 views
2

我打算將現有的應用程序製作爲RTD serverRTD - 將示例COM DLL製作成COM文件

該應用程序目前用C++編寫,雖然我最終將其移植到C#/ Mono,但我希望能夠使用C++添加RTD功能。

我發現的代碼幾樣件(在MSVCRTDServer)與本網站:http://weblogs.asp.net/kennykerr/archive/2008/10/29/excel-rtd-server-in-c.aspx

不幸的是這些DLL和我都忘記了我很久以前就知道COM(甩掉包袱)的。

我該如何將DLL示例合併到EXE中?這顯然是關於將COM服務器封裝在EXE而不是DLL中。

編輯:

注意,現有的應用程序有一個MFC GUI。

編輯:

的用途是taht現有的GUI應用程序將運行 - 無需對COM/RTD界面啓動應用程序的客戶端。 (雖然我不會否認那會很好)

基本上我想用我自己的數據實現IRTDServer接口 - 這樣Excel(或其他應用程序)就可以訪問應用程序提供的動態數據。 (這是一個程序,談判串口設備 - 該設備的狀態/狀態發生變化,我希望能夠更新異步客戶端的變化)

所以,我需要創建一個COM對象和註冊這樣客戶就可以「看到」它。

我不知道如何將COM對象添加到exe,並讓該COM對象實現現有的/預定義的接口。

編輯 我開始了這個賞金,所以我可以得到代碼示例。顯然,我太懶惰和愚蠢(或者也許它只是對COM的超厭惡)開始使用Franci Penov現有的答案。 (這是非常有用的,一個偉大的開始)

所以基本上我所尋找的是:

代碼來採取有一堆運行的線程我現有的基於對話框的MFC應用程序,並把它變成一個RTD服務器(具有相同的用戶界面)

所有共創和CoThisandthat等我在哪裏把代碼放在我的exe文件?我如何擴展/實施IRTD?

樣本MFC Hello World應用程序(基於對話框)之前和之後將獲得接受的答案。

  1. 在應用所有的mfc對話框應用程序的源代碼之前。
  2. 「之後」的應用程序基於實施RTD srver接口及其所有源的步驟#1中的MFC應用程序。 (所有項目文件,來源等)
  3. 在GUI/visual studio中採取的步驟,否則從第1步創建第2步。 (IDL等創建的其他文件。)

理想情況下,這是爲VS2008提供的,但任何版本都可以使用。

謝謝。

回答

3

編輯:老兄,我從2000年起就沒有碰過MFC。我曾經希望在我的餘生中保持這種狀態。 :-)反正...

Aparently,奇才自上世紀演變。以下步驟爲VS 2008添加ATL COM支持和MFC應用程序。

  1. 生成一個名爲MFCTest的簡單MFC基於對話框的應用程序。 不要檢查嚮導中的自動化複選框。
  2. 右鍵單擊該項目,並選擇添加/班......在對話框中,選擇ATL簡單對象。您會收到ATL支持將被添加到項目的警告。
  3. 新的嚮導將打開並顯示新的ATL對象的選項。

你應該做的。

坦率地說,我看不出有任何理由在這裏發表一個嚮導生成的代碼。但是如果您對該代碼的特定部分有進一步的問題,請將它們發佈到SO上,我會幫助您。


編輯:這是慢慢地變成了一篇文章。如果我們繼續這樣下去,我甚至可能會出版一本書。 :-)

一旦你有了集成在MFC項目簡單的ATL對象,你可以在RTD接口添加到它。您將需要從界面繼承並將其添加到COM_INTERFACE_MAP。由於RTD接口是IDispatch界面,你將不得不從的IDispatchImpl <繼承類>和使用COM_INTERFACE_ENTRY2(以指定它是通過IRtdServer實施IDispatch接口添加到COM_INTERFACE_MAP

我並不真正熟悉與RTD是如何工作的,你可能還需要add support for COM connection points你的課,Excel是否需要supscribe到您的更新,這裏也是一個鏈接刷新connection points in ATL知識。

順便說一句,我偶然發現了一個具有C++ definitions of the two RTD interfaces這篇博客文章。你可能已經擁有了它們,但我想我會爲了完整而添加它。


最簡單的方法是通過VS嚮導創建新的ATL EXE項目,並讓它採用註冊和過程管理部分。其餘的沒有那麼不同。

如果你需要一個特定的樣本來啓動你的旅途回到COM的土地外的進程內,你可以看看LABRADOR

夫婦的鏈接,可能會進一步感興趣的你:

編輯:如果你只需要知道如何註冊一個對象在你的EXE中用COM,所以客戶端應用程序可以CocreateInstance它,檢出CoRegisterClassObject。但是:

  • 對象必須是一個COM對象
  • 你需要實現一個類工廠是
  • 如果你想流程管理(即COM開始您的需求的應用程序),添加一個類內斯在註冊表中
  • 如果客戶正在經歷的ProgID創建它註冊,進程id需要在註冊表中註冊
  • 你可能需要一個定製的代理/存根DLL,如果你正在做的自定義編組
  • 如果你的應用程序有用戶界面,你將不得不修改關機邏輯,這樣當用戶關閉UI,應用程序不會退出untili最後一個COM引用你的對象已被釋放以及

編輯2:我仍然建議你看一下ATL out-of-proc示例,ATL嚮導會生成一個框架來理解操作的順序。但是,您可能需要在ATL代碼中仔細研究一下,看看究竟發生了什麼。

具體的過程短版本:

上有啓動,應用程序內斯檢查特定的命令行參數 - /嵌入式。如果這種說法存在,這意味着該應用程序正由COm發起以響應CoCO呼叫。此時,應用可能會選擇不顯示其用戶界面。

無論應用程序是否顯示UI,它都必須爲它通過上面提到的CoRegisterClassObject API提供的任何COM對象註冊類工廠。

如果應用程序是通過COM啓動的,它可以選擇在最後的COM參考版本上關閉自身。 (通常通過一個額外的全局參考計數器來檢測,該計數器在任何對象AddRef上增加並在任何對象發佈中減少)。但是,如果應用檢測到用戶與其UI交互,則應用不應該自行關閉。在這種情況下,關機被推遲到用戶明確關閉最後一個UI爲止(爲了使檢測更容易,應用通常不顯示其UI,直到用戶嘗試明確地啓動它)

如果應用是由用戶和las UI已關閉,應用程序應檢查是否有未完成的COM對其中任何對象的引用。如果沒有,它可以自行關閉。但是,如果有COM引用,應用程序應該隱藏UI,但繼續運行直到最後一個引用被釋放。

如果應用程序已達到它將關閉的點,則應撤消所有類工廠註冊。

+0

是的,從頭開始可能是比較容易的,但整點是我有一個現有的應用程序,會是怎樣的數據來源,我想鞋拔的RTD代碼到它... 我會看看鏈接。謝謝 – Tim 2009-02-14 06:44:30

+0

感謝您的額外信息。這可能足以讓我走了。 – Tim 2009-02-14 07:16:40