討論區快速選單
知識庫快速選單
網路投保旅行平安險 掌握Salesforce雲端管理秘訣
[ 回上頁 ] [ 討論區發言規則 ]
在COM+註冊好後..要呼叫卻有問題..
更改我的閱讀文章字型大小
作者 : jazboy(Ethan)
[ 貼文 43 | 人氣 6565 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/8/26 上午 11:10:44
因為專案的一小小部份要呼叫一個com+的東西...小弟不曾碰過com的東西..以下的語法也是從網路上抓下來...小小的修改後....符合自己的需要...但就是run不起來..
hr = CoCreateInstance(clsid, NULL, CLSCTX_SERVER...... 掛在這一行...
各位大人..有什麼方式可解決呢?

======================
#include "stdafx.h"
#include <windows.h>
#include <olectl.h>



int main(int argc, char* argv[])
{
IDispatch* pDisp = NULL;
CLSID clsid;
DISPID clsSend;

HRESULT hr = CLSIDFromProgID(L"EOrgServer.EOrgIn.1.1", &clsid);

if (!FAILED(hr))
{
hr = CoCreateInstance(clsid, NULL, CLSCTX_SERVER, 
IID_IUnknown, (void **)&pDisp);

WCHAR *Name = L"Version";
if (!FAILED(hr))
{
hr = pDisp->GetIDsOfNames(IID_NULL, &Name, 1, LOCALE_SYSTEM_DEFAULT, &clsSend);
}
DISPPARAMS DispParams;
DispParams.rgvarg = NULL;
DispParams.cArgs = 0;
DispParams.cNamedArgs = 0;
DispParams.rgdispidNamedArgs = NULL;

DispParams.rgvarg[0].vt = VT_BSTR;
VARIANT vResult;
hr = pDisp->Invoke(clsSend, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
&DispParams, &vResult, NULL, NULL);
if( !FAILED(hr) )
{
printf("Got function!!\n");
}

}

printf("Hello World!\n");
return 0;
}

作者 : good(估得)
[ 貼文 146 | 人氣 225 | 評價 480 | 評價/貼文 3.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/8/27 上午 09:26:09
對於每個Thread,要使用COM所提供的函數之前,必須要先呼叫CoInitializeEx or CoInitialize,不使用的時候,要呼叫CoUninitialize,詳細說明請參考MSDN
作者 : jazboy(Ethan)
[ 貼文 43 | 人氣 6565 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/8/27 下午 02:32:59
感謝估得大哥...
一語驚醒夢中人....

再請教..
CreateInstance建好後...我想使用這dll裡一個function..Version..不用傳入任何的參數...所以在下宣告如下..
但Inoke時..就會發生錯誤..感覺起來我的做法是錯的...

WCHAR *Name = L"Version";
hr = pDisp->GetIDsOfNames(IID_NULL, &Name, 1, LOCALE_SYSTEM_DEFAULT, &clsSend);
DISPPARAMS DispParams;
DispParams.rgvarg = NULL;
DispParams.cArgs = 0;
DispParams.cNamedArgs = 0;
DispParams.rgdispidNamedArgs = NULL;

// DispParams.rgvarg[0].vt = VT_BSTR;
// DispParams.rgvarg[0].bstrVal = bstrServiceId;
VARIANT vResult;
hr = pDisp->Invoke(clsSend, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
&DispParams, &vResult, NULL, NULL);
作者 : good(估得)
[ 貼文 146 | 人氣 225 | 評價 480 | 評價/貼文 3.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/8/27 下午 05:38:25
vResult在使用前要先呼叫VariantInit作初始化,使用完後要呼叫VariantClear釋放資源。

你應該考慮使用ATL提供的CComVariant類別來操作VARAINT,及CComDispatchDriver類別來操作IDispatch物件,這樣會比較簡單而且安全。
作者 : jazboy(Ethan)
[ 貼文 43 | 人氣 6565 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/8/27 下午 05:50:32
感謝..我會把它寫成一個atl project..,我現行只是為了方便測試有無正確的取出我所想用的函數..才這樣做1.....

感謝哦..
作者 : good(估得)
[ 貼文 146 | 人氣 225 | 評價 480 | 評價/貼文 3.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/8/28 上午 09:17:33

>感謝..我會把它寫成一個atl project..,我現行只是為了方便測試有無正確的取出我所想用的函數..才這樣做1.....
>
>感謝哦..
不需要吧!ATL也可以在不同專案裡面用,不見得一定要ATL的專案
作者 : jazboy(Ethan)
[ 貼文 43 | 人氣 6565 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/8/29 下午 12:21:50
無言以對....小弟太笨了.小小的function還是呼叫不出來...原制做此com dll的公司已經倒了...現在只剩我的客戶在用它而己...客戶公司裡的人只用vb或asp來使用此dll...(因為guide line都是以vb&asp為範例)...所以小弟要用vc來呼叫完全沒人可support..現在CLSIDFromProgID,CoCreateInstance,GetIDsOfNames都沒錯誤...但 Invoke時..就嗝屁了...回傳負值......然後用MessageBox印出來看是 "Call Cancellation已停用" ...那位長官可提供意見給小弟一下.....感恩....

=======================
#include "stdafx.h"
#include <windows.h>
#include <olectl.h>
#include <objbase.h>


int main(int argc, char* argv[])
{
IDispatch* pDisp;
CLSID clsid;
DISPID clsSend;
CoInitialize(NULL);
HRESULT hr = CLSIDFromProgID(L"EOrgServer.EOrganization.1.1", &clsid);

if (!FAILED(hr))
{
hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pDisp);
if( !FAILED(hr) )
{
VARIANT vResult;
VariantInit(&vResult);
WCHAR *Name = L"Provider";
hr = pDisp->GetIDsOfNames(IID_NULL, &Name, 1, LOCALE_SYSTEM_DEFAULT, &clsSend);
if( !FAILED(hr) )
{
DISPPARAMS DispParams;
DispParams.rgvarg = NULL;
DispParams.cArgs = 0;
DispParams.cNamedArgs = 0;
DispParams.rgdispidNamedArgs = NULL;

hr = pDisp->Invoke(clsSend, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
&DispParams, &vResult, NULL, NULL);
if( !FAILED(hr) )
{
printf("Got function!!\n");
}

LPVOID lpMsgBuf;
FormatMessage( 
FORMAT_MESSAGE_ALLOCATE_BUFFER | 
FORMAT_MESSAGE_FROM_SYSTEM | 
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
hr, //GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL 
);
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );

}
CoUninitialize();
}
}
return 0;
}
作者 : good(估得)
[ 貼文 146 | 人氣 225 | 評價 480 | 評價/貼文 3.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/8/30 下午 01:25:18
我有寫一個com物件,然後使用你的程式去呼叫,並沒有錯誤。
我想錯誤應該是你的物件產生的,看一下你的com物件的使用說明。
作者 : jazboy(Ethan)
[ 貼文 43 | 人氣 6565 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/9/2 上午 11:00:44
估得兄...
你能可幫我看一下這com dll是什麼"規格"嗎???
雖然不太適合請求你...但小弟已經走頭無路了...全公司沒人寫過com的東西..
再加上原始開發這元件的公司..已經關門大吉了....
我實在是測不出來...所以希望那位好心的大人幫幫忙啊..


Ethan.
novatw@ms22.url.com.tw
icq#:120104118
作者 : good(估得)
[ 貼文 146 | 人氣 225 | 評價 480 | 評價/貼文 3.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/9/2 下午 01:16:11

>估得兄...
>你能可幫我看一下這com dll是什麼'規格'嗎???
>雖然不太適合請求你...但小弟已經走頭無路了...全公司沒人寫過com的東西..
>再加上原始開發這元件的公司..已經關門大吉了....
>我實在是測不出來...所以希望那位好心的大人幫幫忙啊..
>
>
>Ethan.
>novatw@ms22.url.com.tw
>icq#:120104118

    我很樂意幫忙,你可以把dll mail給我,我可以花時間幫你試試看,最好要有一些說明檔,不過,我想你遇到的問題應該不是com的問題,應該是物件本身的狀態不對,例如:物件在使用前應該先呼叫物件自己定義的初始化函數,或是可能需要遠端data base,才會造成你的函數呼叫失敗。
 
    可以給我之前是怎麼使用這個物件的sample code嗎?用vb script或是jscript的也沒有關係。

我的e-mail:jackochang@pixord.com
作者 : good(估得)
[ 貼文 146 | 人氣 225 | 評價 480 | 評價/貼文 3.29 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2002/9/3 上午 10:02:06

#include "stdafx.h"
#include <comdef.h>

#import "EOrgServer.dll" no_namespace

int main(int argc, char* argv[])
{
int res = 0;
HRESULT hr = S_OK;

IEOrganizationPtr p;
try
{
hr = CoInitialize(NULL);
if(FAILED(hr))
throw NULL;

hr = p.CreateInstance("EOrgServer.EOrganization");
if(FAILED(hr))
throw NULL;

BSTR ver = NULL;
hr = p->get_Version(&ver);
if(FAILED(hr))
throw NULL;

printf("Version is %s.\n", (const char*)_bstr_t(ver));
SysFreeString(ver);
}
catch(...)
{
res = -1;
}

p.Release();
CoUninitialize();

return res;
}
 板主 : 徵求中
 > 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-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875