PALMisLIFE 討論區

搜索
鹹魚爸魅力四射舞蹈教室
查看: 1448|回復: 3
打印 上一主題 下一主題

[求助] 呼叫COM的問題

[複製鏈接]

22

主題

0

好友

513

積分

該用戶從未簽到

文章
465
跳轉到指定樓層
1#
發表於 2003-11-6 13:58 |只看該作者 |倒序瀏覽
呼叫一個同事寫的OLE SERVER...
可是當我進行到呼叫Invoke時, 傳回的HRESULT值老是E_INVALIDARG
我左看右看看不出錯誤
請問有誰知道問題在那嗎??

void LaunchTTR(QUEUE_TYPE& item)
{
        // initial com
        if (FAILED(CoInitialize(NULL))) {
                MessageBox(NULL, _T("Can not initial COM"), _T("Batch"), MB_OK);
                return;
        }

        // 取得CLSID
        CLSID id;
        if (FAILED(CLSIDFromProgID(CA2W("SearchOleSrv.TSearchServer"), &id))) {
                MessageBox(NULL, _T("Can not initial OLE Server"), _T("Batch"), MB_OK);
                return;
        }

        // 建立物件的instance
        LPUNKNOWN pUnknown = NULL;
        if (CoCreateInstance(id, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pUnknown) != S_OK) {
                MessageBox(NULL, _T("Can not initial OLE Server"), _T("Batch"), MB_OK);
                return;
        }

        // query interface
        IDispatch* pDisp = NULL;
        if (pUnknown->QueryInterface(IID_IDispatch, (void **)&pDisp) != S_OK) {
                MessageBox(NULL, _T("Can not get IDispatch interface!"), _T("Batch"), MB_OK);
                return;
        }

        // release IUnknown
        pUnknown->Release();

        VARIANT vResult;
        HRESULT hr;
        DISPID dispID;

        VariantInit(&vResult);
        LPOLESTR szName = L"CreateReport";

        // 取得函數的id
        hr = pDisp->GetIDsOfNames(IID_NULL, &szName, 1, LOCALE_USER_DEFAULT, &dispID);
        if(FAILED(hr)) {
                MessageBox(NULL, _T("Can not get function name!"), _T("Batch"), MB_OK);
                return;
        }

        // 設定要執行的參數
        DISPPARAMS DispParams;
        VARIANTARG vararg[5];

        DispParams.rgvarg = vararg;
        DispParams.cNamedArgs = 0;
        DispParams.rgdispidNamedArgs = NULL;
        DispParams.cArgs = 5;

        VariantInit(&DispParams.rgvarg[4]);
        VariantInit(&DispParams.rgvarg[3]);
        VariantInit(&DispParams.rgvarg[2]);
        VariantInit(&DispParams.rgvarg[1]);
        VariantInit(&DispParams.rgvarg[0]);

        DispParams.rgvarg[4].vt = VT_I4;
        DispParams.rgvarg[4].iVal = 0;

        DispParams.rgvarg[3].vt = VT_BSTR;
        DispParams.rgvarg[3].bstrVal = SysAllocString(CA2W("20030101"));

        DispParams.rgvarg[2].vt = VT_BSTR;
        DispParams.rgvarg[2].bstrVal = SysAllocString(CA2W("C:\\test.cfg"));

        DispParams.rgvarg[1].vt = VT_BSTR;
        DispParams.rgvarg[1].bstrVal = SysAllocString(CA2W("C:\\test2.rpt"));

        VARIANT vMsg;
        VariantInit(&vMsg);
        DispParams.rgvarg[0].vt = VT_VARIANT;
        DispParams.rgvarg[0].pvarVal = &vMsg;

        // 執行函數
        hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &DispParams, &vResult, NULL, NULL);
        if(FAILED(hr)) {
                MessageBox(NULL, _T("Can not execute function!"), _T("Batch"), MB_OK);
                return;
        }

        pDisp->Release();

        CoUninitialize();
}

每次呼叫完Invoke後傳回值都是E_INVALIDARG
CreateReport的proto type為
HRESULT _stdcall CreateReport(long iBatchType, BSTR strReportDateParam, BSTR strCfgFileName, BSTR strOutReportFileName, VARIANT * strOutErrMsg );

請問到底是那邊寫錯了???
分享淘帖0 分享分享0 收藏收藏0 頂0 踩0
--MSNP8 我跟你拼了!!!

2

主題

0

好友

38

積分

該用戶從未簽到

文章
58
2#
發表於 2003-11-6 14:16 |只看該作者

Re: [求助] 呼叫COM的問題

可能是參數的傳遞順序有錯,印象中有特定的順序
回復

使用道具 舉報

22

主題

0

好友

513

積分

該用戶從未簽到

文章
465
3#
發表於 2003-11-6 15:50 |只看該作者

Re: [求助] 呼叫COM的問題

不是參數傳遞的問題....
參數傳遞的順序是倒反的....
也就是說在CreateReport這個method中
第一個參數iBatchType在傳遞時是array中的最後一個
--MSNP8 我跟你拼了!!!
回復

使用道具 舉報

22

主題

0

好友

513

積分

該用戶從未簽到

文章
465
4#
發表於 2003-11-11 13:50 |只看該作者

Re: [求助] 呼叫COM的問題

推一下....
真的沒有人知道嗎??
@@
--MSNP8 我跟你拼了!!!
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 免費註冊

與站長聯繫| PALMisLIFE 掌上生活      下載:更快、更棒、更好玩

GMT+8, 2024-12-24 10:34 , Processed in 0.022500 second(s), 30 queries , Gzip On.

Powered by Discuz!

© 2001-2012 Comsenz Inc. style by eisdl

回頂部