COM サーバーに関して、大きくて理解しにくい問題が 1 つあります。クライアント アプリケーションを CANoe (Vector によるアプリケーション) に書き込もうとしています。彼らはCANoe.tlb、CANoe.h、およびCANoe_i.cppファイルを提供しましたが、#import経由でCANoe.tlbのみを使用しています。すべての例は Visual Basic であり、私は VC++ (コンソール アプリケーション) で記述しようとしています。問題は継承にあります。つまり、彼らが書いたヘルプでは、メイン オブジェクトは Application であり、すべてのメソッド、オブジェクト イベントなどへのアクセスは、このオブジェクトを介してのみ可能であると書かれています。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
PS COMサーバーの使用は私にとって初めてなので、最終的に愚かな間違いをして申し訳ありません。役立つ情報を探していましたが、この COM インターフェイスの使用に関する情報は見つかりませんでした。