Я работаю над проектом, в котором мне нужно использовать интерфейс автоматизации для автоматизации конфигурации TwinCat. Согласно руководству Beckhoff, мне нужно добавить ссылку на COM-объект TcatSysManagerLib и EnvDTE.DTE, чтобы иметь возможность используйте интерфейс автоматизации TwinCat и API Visual Studio. Я следую за всеми шагами, но это, кажется, не работает. Здесь код заголовочного файла "stdafx.h"
//the following #import imports EnvDTE based on its LIBID.
#import"libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("10.0") lcid("0") raw_interfaces_only named_guids
// Imports die "Beckhoff TCatSysManager 1.1 Type Library"
#import"libid:3C49D6C3-93DC-11D0-B162-00A0248C244B" version("3.1") lcid("0")
В исходном файле у меня есть следующий код
#include "stdafx.h"
#include <iostream>
#include <atlbase.h>
#include <atlcom.h>
using namespace std;
using namespace TCatSysManagerLib;
using namespace EnvDTE;
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL); // COM initialisieren
cout << "Creating VisualSTudio.DTE.10.0 ...";
// creating a new instance of Visual Studio
CComPtr<_DTE> m_pDTE;
HRESULT hr = m_pDTE.CoCreateInstance(L"VisualStudio.DTE.10.0", 0, CLSCTX_ALL);
if (FAILED(hr)) { cout << " FAILED"; return 1; }
cout << " created." << endl;
// retrieves the EnvDTE.Solution-Objekt
CComPtr<_Solution> pSolution;
m_pDTE->get_Solution(&pSolution);
CComBSTR strSolutionFolder(_T("C:\\Users\\X240\\3D Objects\\Implementation\\Test")); // Solution-main directory (has to exist)
CComBSTR strSolutionName(_T("MySolution1"));
CComBSTR strTemplatePath(_T("C:\\TwinCAT\\3.1\\Components\\Base\\PrjTemplate\\TwinCATProject.tsproj"));
CComBSTR strSolutionPath; // Solution-Pfad (doesn’t exist!)
strSolutionPath = strSolutionFolder;
strSolutionPath.Append(_T("\\"));
strSolutionPath.Append(strSolutionName);
strSolutionPath.Append(_T(".sln"));
// create the solution
hr = pSolution->Create(strSolutionFolder, strSolutionName);
CComBSTR strProjectPath(strSolutionFolder); // project path
strProjectPath.Append(_T("\\"));
strProjectPath.Append(strSolutionName);
CComBSTR strProjectName = "MyProject"; // project name // create projekt from a template
CComPtr pProject;
hr = pSolution -> AddFromTemplate(strTemplatePath, strProjectPath, strProjectName, VARIANT_FALSE, &pProject);
// Wenn z.B. Projekt bereits besteht >> error
if (FAILED(hr)) { cout << " Project creation FAILED"; return 1; }
cout << "Project created" << endl;
// define project automation class (here the Coclass TcSysManager)
CComPtr pDispatch;
hr = pProject->get_Object(&pDispatch);
// retrieve ITcSysManager interface
CComPtr pSystemManager;
hr = pDispatch.QueryInterface(&pSystemManager);
// operate with SystemManager interface
CComBSTR netId;
netId = (pSystemManager->GetTargetNetId()).GetBSTR();
cout << "TargetNetId: " << netId << endl;
hr = pSystemManager->ActivateConfiguration();
hr = pSystemManager->StartRestartTwinCAT();
// save project and solution
hr = pProject->Save(CComBSTR());
hr = pSolution->SaveAs(strSolutionPath);
cout << "Succeeded";
return 0;
}
Я получаю слишком много ошибок. Во-первых, c ++ не может открыть файл "libid: 3C49D6C3-93D C -11D0-B162-00A0248C244B.tlh"
Все остальные ошибки происходят в файле "dte80a.tlh" и являются все то же самое:
enum "EnvDTE :: XXXX" был ранее объявлен как другой тип перечисления
В проекте я добавил ссылки на библиотеку типов TCatSysManagerLib и в EnvDTE и EnvDTE80, как указано в Руководстве. Я не знаю, почему это не работает