Интерфейс автоматизации TwinCat C ++ - PullRequest
0 голосов
/ 24 апреля 2020

Я работаю над проектом, в котором мне нужно использовать интерфейс автоматизации для автоматизации конфигурации 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, как указано в Руководстве. Я не знаю, почему это не работает

...