PALMisLIFE 討論區

標題: [求助] 呼叫COM的問題 [列印本頁]

作者: feiyang    時間: 2003-11-6 13:58
標題: [求助] 呼叫COM的問題
呼叫一個同事寫的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 );

請問到底是那邊寫錯了???
作者: jerrys    時間: 2003-11-6 14:16
標題: Re: [求助] 呼叫COM的問題
可能是參數的傳遞順序有錯,印象中有特定的順序
作者: feiyang    時間: 2003-11-6 15:50
標題: Re: [求助] 呼叫COM的問題
不是參數傳遞的問題....
參數傳遞的順序是倒反的....
也就是說在CreateReport這個method中
第一個參數iBatchType在傳遞時是array中的最後一個
作者: feiyang    時間: 2003-11-11 13:50
標題: Re: [求助] 呼叫COM的問題
推一下....
真的沒有人知道嗎??
@@




歡迎光臨 PALMisLIFE 討論區 (http://f.pil.tw/) Powered by Discuz! X2.5