我的開發環境是WIN7 + VS2008,做的是一款跟液體仿真有關的軟體,需要安裝Flowmaster v7.5,當時控制元件供應者提供了一個xx.dll的介面供呼叫,然后還有一個.h檔案和.cpp檔案,在提供的測驗代碼中,其他部分都沒有問題,但是當執行一個功能是分析結果的函式的時候,執行速度非常慢,而且有的時候能成功,有的時候卻報例外。
呼叫這個函式的代碼是:network.RunAnalysis("zz","vc call","SS",FALSE,FALSE);
追蹤進去函式源代碼是
CString IDE_Doc::RunAnalysis(LPCTSTR sOwner, LPCTSTR sDescription, LPCTSTR sAnalysisCode, short shtHeatTransfer, short shtComponentInteraction)
{
CString result;
static BYTE parms[] =
VTS_BSTR VTS_BSTR VTS_BSTR VTS_I2 VTS_I2;
InvokeHelper(0x9, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms,
sOwner, sDescription, sAnalysisCode, shtHeatTransfer, shtComponentInteraction);
return result;
}
除錯下的輸出為:
執行緒 'Win32 執行緒' (0x88c) 已退出,回傳值為 0 (0x0)。
“dll_ss.exe”: 已加載“ImageAtBase0x10050000”,未加載任何符號。
“dll_ss.exe”: 已加載“ImageAtBase0x8440000”,未加載任何符號。
“dll_ss.exe”: 已卸載“ImageAtBase0x10050000”
“dll_ss.exe”: 已加載“ImageAtBase0x5bcb0000”,未加載任何符號。
“dll_ss.exe”: 已加載“ImageAtBase0x8500000”,未加載任何符號。
“dll_ss.exe”: 已卸載“ImageAtBase0x5bcb0000”
“dll_ss.exe”: 已加載“C:\Program Files (x86)\Flowmaster\FlowmasterV7\Flowmaster.Analysis.FluidProperties.dll”,未使用除錯資訊生成二進制檔案。
“dll_ss.exe”: 已加載“ImageAtBase0x5bca0000”,未加載任何符號。
“dll_ss.exe”: 已加載“ImageAtBase0x8540000”,未加載任何符號。
“dll_ss.exe”: 已卸載“ImageAtBase0x5bca0000”
“dll_ss.exe”: 已加載“C:\Program Files (x86)\Flowmaster\FlowmasterV7\Flowmaster.External.FluidProperties.dll”,未使用除錯資訊生成二進制檔案。
“dll_ss.exe”: 已加載“ImageAtBase0x5bc90000”,未加載任何符號。
“dll_ss.exe”: 已加載“ImageAtBase0x8550000”,未加載任何符號。
“dll_ss.exe”: 已卸載“ImageAtBase0x5bc90000”
“dll_ss.exe”: 已加載“C:\Program Files (x86)\Flowmaster\FlowmasterV7\Flowmaster.Scripting.dll”,未使用除錯資訊生成二進制檔案。
“dll_ss.exe”: 已加載“ImageAtBase0x5bc70000”,未加載任何符號。
“dll_ss.exe”: 已加載“ImageAtBase0x8560000”,未加載任何符號。
“dll_ss.exe”: 已卸載“ImageAtBase0x5bc70000”
“dll_ss.exe”: 已加載“C:\Program Files (x86)\Flowmaster\FlowmasterV7\Flowmaster.LibraryAccess.dll”,未使用除錯資訊生成二進制檔案。
執行緒 'Win32 執行緒' (0x1310) 已退出,回傳值為 0 (0x0)。
(到這里要執行二三十秒才往下跳)
“dll_ss.exe”: 已加載“ImageAtBase0x5b9e0000”,未加載任何符號。
“dll_ss.exe”: 已加載“ImageAtBase0xd240000”,未加載任何符號。
“dll_ss.exe”: 已卸載“ImageAtBase0x5b9e0000”
“dll_ss.exe”: 已加載“C:\Program Files (x86)\Flowmaster\FlowmasterV7\Flowmaster.Analysis.Models.dll”,未使用除錯資訊生成二進制檔案。
“dll_ss.exe”: 已加載“ImageAtBase0x5b9b0000”,未加載任何符號。
“dll_ss.exe”: 已加載“ImageAtBase0x6380000”,未加載任何符號。
“dll_ss.exe”: 已卸載“ImageAtBase0x5b9b0000”
“dll_ss.exe”: 已加載“C:\Program Files (x86)\Flowmaster\FlowmasterV7\Flowmaster.Analysis.Controllers.dll”,未使用除錯資訊生成二進制檔案。
“dll_ss.exe”: 已加載“ImageAtBase0x6630000”,未加載任何符號。
“dll_ss.exe”: 已加載“ImageAtBase0x6660000”,未加載任何符號。
“dll_ss.exe”: 已卸載“ImageAtBase0x6630000”
“dll_ss.exe”: 已加載“C:\Program Files (x86)\Flowmaster\FlowmasterV7\Interop.MSScriptControl.dll”,未使用除錯資訊生成二進制檔案。
“dll_ss.exe”: 已加載“C:\Windows\SysWOW64\msscript.ocx”
“dll_ss.exe”: 已加載“C:\Windows\SysWOW64\vbscript.dll”
追蹤進去
// make the call
SCODE sc = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags,
&dispparams, pvarResult, &excepInfo, &nArgErr);
主要是這個函式呼叫耗時很久,而且是不是編譯器還報一個未處理的例外COleDispatchException
按照我老師以前的經驗,這個程序本來應該只要一兩秒鐘的,但是我這樣執行一次速度太慢了。
由于需要在代碼中頻繁呼叫,所以說肯定不現實,請問一下各位,知道這是什么原因嘛,萬分感謝。
uj5u.com熱心網友回復:
請問一下這是什么原因呢?弄了好幾天了沒啥頭緒,介面是封裝好的沒法打開看里面的東西,是在軟體里面需要進行什么設定,還是說VS使用OLE控制元件需要匯入什么東西還是設定什么?望有相關經驗的同志們指點一下啦uj5u.com熱心網友回復:
介面是封裝好沒法打開看那COleDispatchDriver是哪里來的?例外得抓下來報給用戶(比如讓用戶選擇重試還是取消)。例外包含的訊息也有助于診斷原因。
uj5u.com熱心網友回復:
捕捉 COleDispatchException ,看是否有報錯資訊,或者輸出傳遞的引數,讓控制元件提供者幫助分析
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/57523.html
