我的开发环境是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
按照我老师以前的经验,这个过程本来应该只要一两秒钟的,但是我这样执行一次速度太慢了。
由于需要在代码中频繁调用,所以说肯定不现实,请问一下各位,知道这是什么原因嘛,万分感谢。

解决方案 »

  1.   

    请问一下这是什么原因呢?弄了好几天了没啥头绪,接口是封装好的没法打开看里面的东西,是在软件里面需要进行什么设置,还是说VS使用OLE控件需要导入什么东西还是设置什么?望有相关经验的同志们指点一下啦
      

  2.   

    接口是封装好没法打开看那COleDispatchDriver是哪里来的?异常得抓下来报给用户(比如让用户选择重试还是取消)。异常包含的消息也有助于诊断原因。
      

  3.   

    捕捉 COleDispatchException ,看是否有报错信息, 
    或者输出传递的参数,让控件提供者帮助分析