我有一个很大而难以理解的COM服务器问题。我正在尝试将客户端应用程序写入CANoe(Vector的应用程序)。他们给了CANoe.tlb,CANoe.h和CANoe_i.cpp文件,但我只通过#import使用了CANoe.tlb。所有的例子都在Visual Basic中,我试图用VC++(控制台应用程序)编写它。问题在于继承。即在他们写的帮助中,主要对象是应用程序,只有通过此对象才能访问所有方法,对象事件等。 Visual Basic中的所有例子也很简单,例如:如何访问CANoe COM服务器接口中的子对象
Dim gCanApp As CANalyzer.Application
Set gCanApp = New Application
gCanApp.Open ("C:\Program Files\CANalyzer\Demo_CL\motbus.cfg")
gCanApp.CAPL.Compile
gCanApp.Measurement.Start
我确定我犯了错误,但我不知道在哪里。简而言之,我无法访问子对象,他们的方法等。我只能访问应用程序的方法。例如,我想以这种方式调用从测量对象开始的方法:pApp-> Measurement-> Start(),但这是不可能的。
我的源代码:
#import "CANoe.tlb" //importing CANoe type library
#include "stdafx.h"
#include <atlbase.h> //COM Server methods
#include <iostream>
using namespace CANoe;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
/*This part is working perfectly: */
CComPtr<IApplication> pApp = NULL;
CComPtr<IMeasurement> measure = NULL;
CComPtr<ICAPL> capl = NULL;
CLSID clsid;
IID iid;
HRESULT result;
/* Initialization COM library: */
if (FAILED(CoInitialize(NULL)))
{
cerr << "Initialization COM Library error" << endl;
system("pause");
return 1;
}
if((result = CLSIDFromProgID(L"CANoe.Application", &clsid)) != S_OK)
{
cerr << "Problem with opening application" << endl;
system("pause");
return 2;
}
result = pApp.CoCreateInstance(clsid); //Opening CANoe Application
if(result != S_OK)
cout << "pApp fault" << endl;
pApp->Open(L"C:\\test\\test.cfg", FALSE, TRUE); //Opening test.cfg file
/****************End of good part**********************/
//pApp->Measurement->Start();//I'd like to use it in this way - compiler error: error C2039: 'Start' : is not a member of 'IDispatch'
pApp->get_Measurement((IDispatch**)&measure);
measure->Start();//Unhandled exception at 0x7711d78c in canoe.exe: 0xC0000005: Access violation writing location 0x7711d78c.
CoUninitialize(); //Uninitialization COM Library
}
我武官CANoe的COM服务器文件(这是免费试用版法律):http://www.sendspace.com/file/5pgcou
附:使用COM服务器对我来说是新的,所以对于最终的愚蠢错误感到抱歉。我正在寻找任何有用的信息,但我没有找到任何有关使用此COM接口的信息。
我不相信没有人可以帮助我:( – meler
我不能编译PAPP->测量 - 您的样品> start()方法,因为测量retrun它没有启动方法 – Victor
你是对的IDisptach对象。我在第一篇文章中改变了代码,现在它是可编译的,所以也许你可以提出如何使用它的方法使用Measurement对象,我用OLE-COM Object Viewer打开了CANoe.tlb,但是这些信息对我来说并不容易理解。请参阅使用其他对象的解决方案?也许我以错误的方式使用pApp-> GetMeasurement(IDispatch **)。我附上有关使用CANoe COM Server的帮助文件:http://www.sendspace.com/file/7pqxyv – meler