gpt4 book ai didi

visual-c++ - 如何访问 CANoe COM 服务器接口(interface)中的子对象

转载 作者:行者123 更新时间:2023-12-04 08:26:52 25 4
gpt4 key购买 nike

我有一个关于 COM 服务器的大而难以理解的问题。我正在尝试将客户端应用程序写入 CANoe(Vector 应用程序)。他们提供了 CANoe.tlb、CANoe.h 和 CANoe_i.cpp 文件,但我通过#import 仅使用 CANoe.tlb。所有示例都在 Visual Basic 中,我正在尝试用 VC++(控制台应用程序)编写它。问题在于继承。 IE。在他们写的帮助中,主要对象是应用程序,并且只能通过此对象访问所有方法、对象事件等。 Visual Basic 中的所有示例也很简单,即:

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

我确定我犯了错误,但我不知道在哪里。简而言之,我无权访问子对象及其方法等。我只能访问应用程序的方法。例如,我想以这种方式从 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 Server 对我来说是新的,所以很抱歉最终犯了愚蠢的错误。我正在搜索任何有用的信息,但没有找到任何关于使用此 COM 接口(interface)的信息。

最佳答案

尝试更改您的代码:

CComQIPtr<IMeasurement> measure;
CComPtr<IDispatch> measureDisp;

pApp->get_Measurement(&measureDisp);
measure = measureDisp;
measure->Start();

另外不要忘记检查调用方法的结果。

关于visual-c++ - 如何访问 CANoe COM 服务器接口(interface)中的子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com