Я пытаюсь создать отдельное приложение Solidworks (я хочу, чтобы моя программа на С ++ создавала новую геометрию в Solidworks, работая в фоновом режиме). Я использую MSVC ++ Express 2010.
Я попытался реализовать следующий код предложил здесь
//Import the SolidWorks type library
#import "sldworks.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
//Import the SolidWorks constant type library
#import "swconst.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
int _tmain(int argc, _TCHAR* argv[])
{
//Initialize COM
CoInitialize(NULL);
//Use ATL smart pointers
CComPtr<ISldWorks> swApp;
//Create an instance of SolidWorks
HRESULT hres = swApp.CoCreateInstance(__uuidof(SldWorks), NULL, CLSCTX_LOCAL_SERVER);
//My Code here
//Shut down SolidWorks
swApp->ExitApp();
// Release COM reference
swApp = NULL;
//Uninitialize COM
CoUninitialize();
return 0;
}
Он не жалуется на операторы импорта для библиотек, но не собирается из-за следующих ошибок:
1>main.cpp(19): error C2065: 'CComPtr' : undeclared identifier
1>main.cpp(19): error C2275: 'ISldWorks' : illegal use of this type as an expression
1> c:\users\nolan\documents\c++\solidworks_test\solidworks_test\debug\sldworks.tlh(7515) : see declaration of 'ISldWorks'
1>main.cpp(19): error C2065: 'swApp' : undeclared identifier
1>main.cpp(22): error C2065: 'swApp' : undeclared identifier
1>main.cpp(22): error C2228: left of '.CoCreateInstance' must have class/struct/union
1> type is ''unknown-type''
1>main.cpp(26): error C2065: 'swApp' : undeclared identifier
1>main.cpp(26): error C2227: left of '->ExitApp' must point to class/struct/union/generic type
1> type is ''unknown-type''
1>main.cpp(29): error C2065: 'swApp' : undeclared identifier
Очевидно, я что-то упускаю, но я не могу понять, что это такое. Я чувствую, что это как-то связано с ATL, но я не уверен … Пожалуйста, помогите.
Спасибо
РЕДАКТИРОВАТЬ:
Хорошо, я скачал комплект разработки для Windows 8.0, и все файлы там. Я статически связывался с ATL на страницах свойств, я также пытался связать библиотечные файлы в каталоге: C:\Program Files\Windows Kits\8.0\Lib\Atl
Но эти заголовочные файлы нигде не найти … пожалуйста, помогите.
Итак, я нашел решение. Это может быть не самым элегантным, но это работает.
К сожалению, библиотеки объектных файлов ATL в WDK не помогают, поскольку файлы заголовков нигде не найдены.
Итак, после более глубокого изучения я обнаружил, что полная версия Visual Studio (не Express) позволяет использовать библиотеку ATL. Как оказалось, мне повезло, потому что Microsoft раздает студентам полные версии Visual Studio (см. DreamSpark веб-страница), и я, оказывается, студент. 🙂
Таким образом, после загрузки, установки и установки любых пакетов обновления (у меня был только один) у меня был еще один шаг, чтобы заставить его работать:
Я перешел на страницу свойств -> C / C ++ -> General
Я включил каталог, в котором можно найти файлы .tlb (в моем случае C: \ Program Files \ SolidWorks Corp \ SolidWorks)
Затем я запустил следующий код:
//main.cpp
#include <afxwin.h>
#include <iostream>
#import "sldworks.tlb"
void main()
{
//Initialize COM
CoInitialize(NULL);
//Use ATL smart pointers
CComPtr<SldWorks::ISldWorks> swApp;
//Create an instance of SolidWorks
HRESULT hres = swApp.CoCreateInstance(__uuidof(SldWorks), NULL, CLSCTX_LOCAL_SERVER);
//Make the instance visible to the user
swApp->put_Visible(VARIANT_TRUE);
std::cin.get();
//Shut down SolidWorks
swApp->ExitApp();
// Release COM reference
swApp = NULL;
//Uninitialize COM
CoUninitialize();
}
И это было это. Solidworks открывается при запуске программы (дополнительная put_Visible
Функция позволяет пользователю видеть окно), и закрывается без жалоб, когда пользователь нажимает войти в окно консоли.
Похоже, что компилятору не удается найти определения для определенных вещей, в частности CComPtr
который является частью ATL (как вы упомянули). Я не работал с ATL, но сработает ли он, чтобы перейти к свойствам вашего проекта в Visual Studio и убедиться, что для параметра «Использование ATL» установлено значение «Статический» или «Динамический» в зависимости от ситуации?
Как упоминал Джерри, вам также необходимо включить соответствующие заголовки.