討論區快速選單
知識庫快速選單
傑米的攝影旅遊筆記 網路投保旅行平安險 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
求助青衫兄
更改我的閱讀文章字型大小
作者 : czlai(口連的工程師)
[ 貼文 36 | 人氣 6638 | 評價 10 | 評價/貼文 0.28 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/9/7 下午 04:48:50
公司最近接了一個案子,要為國外的一套軟體撰寫Plugin,是以COM的形式處理。我拿到的文件除了介面說明外,還有一個 .IDL,一個.TLB,另外還有一個 VS2008 的 c++ 範例。
但是小弟對COM並不熟悉,而且沒用過 VS2008,我平常都是用 VC++6.0 在寫程式的。
所以研究了好幾天的結果,真的是一頭霧水,我相信這不是困難的東西,但是真的是第一步不知道怎麼跨出去。
請問我該怎麼辦?
我該如何利用那個 .IDL 與 .TLB 來寫出他定義的介面的 COM 呢?
青衫兄救我啊∼
作者 : yctsai(yctsai)
[ 貼文 22 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/9/7 下午 05:44:14
VC2005/2008,開啟新專案選取ATL類型。

他就是你要的東西。

開啟後一切框架都替您建立好了,這時候您會發現專案下面也有 IDL..
您需要的是實作出您手邊那份IDL介面,很簡單的。
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/9/9 上午 12:42:00
1.先用ATL COM AppWizard建立一個專案
2.在ClassView(類別檢視)的classes裡按滑鼠右鍵選New Class(VS2005在專案下選加入類別,然後挑ATL簡單物件),Class的名稱可看一下.idl檔裡library底下找helpstring("xxx Class"),xxx便是應填入的名稱
3.將對方給的.idl檔取代該專案的.idl檔

接下來找.idl檔裡Ixxx的界面, xxx為你前面加入的Class名稱,大抵會看到:

interface Ixxx : IDispatch
{
[propget, id(1), helpstring("property xxx")] HRESULT xxx([out, retval] long *pVal);
[propput, id(1), helpstring("property xxx")] HRESULT xxx([in] long newVal);
[id(2), helpstring("property xxx")] HRESULT xxx([in] long newVal);
};


{}裡的便是該Interface的函數與屬性,也就是你應implement的東西.對每一個函數,在剛剛新增的.h檔:

class xxx :
public IDispatchImpl<....>,

在裡面新增public的函數.例如前述三個函數便應定義成:

STDMETHOD(get_xxx)(long *pVal);
STDMETHOD(put_xxx)(long newVal);
STDMETHOD(xxx)(long newVal);

亦即有propget的,在函數前要加"get_",這是屬性值取得函數,有propput者,函數前要加"put_",完全沒有的便是method,直接用函數名即可.最後在cpp檔裡實作各函數,例如:

STDMETHODIMP xxx::get_xxx(long *pVal)
{
}

STDMETHODIMP xxx::put_xxx(long newVal)
{
}

STDMETHODIMP xxx::xxx(long newVal)
{
}

如果嫌手動加入這些界面函數麻煩,也可以先不將對方給的.idl檔取代該專案的.idl檔,而直接到ClassView,對Ixxx的界面按右鍵,選擇Add Method或Add Property來加入各界面函數,由VC++自行加入這些界面的程式碼,最後再把.idl檔更換來就可以了.
作者 : czlai(口連的工程師)
[ 貼文 36 | 人氣 6638 | 評價 10 | 評價/貼文 0.28 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/9/9 上午 08:23:34
一大早就看到青衫兄詳細的解說,真是太讓我感動了,等一下到公司立刻來試一下。
另外昨天我一直在試著寫簡單的COM,不知道是不是我的方法不對,一直弄不出來,我是這樣做的。
1. 新建立一個專案,選擇 ATL COM AppWizard,並且啟用 MFC Support。
2. 在 ClassView 右鍵選擇 New Class,Class Type 選 ATL Class,並且啟用一個interface。
3. 在 ClassView Interface右鍵 選Add Method,加入一個 Init(long nParam)。
4. Compile 結束。
然後我另開一個專案,產生一個 Dialog App,按下 Button 時做下列的事情:

我先從 ClassWizard 作 Add Class,選From a type library,然後選擇剛剛建立的 Plugin.dll,產生 plugin.h與cpp。
#include "E:\\Financial\\0_AP\\COM\\Plugin\\Plugin_i.c"
#include "plugin.h"
///從青衫兄另一篇文章抄來的
void CTestPluginDlg::OnButtonAct()
{
IMCPlugin* my_dll=NULL;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_MCPlugin,NULL,CLSCTX_ALL,IID_IMCPlugin,(void**)&my_dll);
if (FAILED(hr) {
MessageBox("Load Failed", "PluginLoader", MB_OK|MB_TOPMOST);
return;
}

my_dll->Init(0);
}
很奇怪的這樣會當在 my_dll->Init(0);
請問我做錯了什麼地方嗎?感謝指導!
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/9/10 上午 07:01:17
就例子而言, 看不出有什麼缺失...

最近正在6頭燒 (也就是有6個工作同時在進行中, 累啊...), 已沒有太多餘的時間幫你仔細測看看. 先自行試試吧, 真的沒法, 我再設法抽空幫你找問題.
作者 : czlai(口連的工程師)
[ 貼文 36 | 人氣 6638 | 評價 10 | 評價/貼文 0.28 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/9/10 上午 09:26:44
青衫兄辛苦了!
因為原來的問題已經找到答案了,所以後面這個問題也變的不急迫了!
等青衫閒下來時,在幫小弟看看囉!
感恩∼
 板主 : 徵求中
 > COM/DCOM - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - COM/DCOM - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
COM/DCOM
1 估得 490 
2 nick 120 
3 PLAYER 110 
4 天雲 100 
5 Raynor 80 
6 青衫 60 
7 60 
8 Peter.huang 50 
9 酷小毅 50 
10 Giant 50 
COM/DCOM
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2017 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125