Сообщество программистов Autodesk в СНГ

ADN Club => Fusion 360 API => Тема начата: dr.B00 от 24-05-2016, 16:16:44

Название: LoadLibrary
Отправлено: dr.B00 от 24-05-2016, 16:16:44
Добрый день. Подскажите возможно ли в скриптах на с++ подключение dll?
Пробовал таким образом - не получилось.
Код - C++ [Выбрать]
  1.         HMODULE hDll;
  2.  
  3.         hDll = LoadLibrary(_T("fusion_cmm.dll"));
  4.         if (!hDll)
  5.         {
  6. ...
  7.  
Название: Re: LoadLibrary
Отправлено: Александр Ривилис от 24-05-2016, 16:33:13
dr.B00
Приветствую на форуме!
1. Ознакомься пожалуйста с правилами форматирования кода на форуме и соблюдай их.
2. А если попробовать задать полный путь к файлу?
3. Почему if (!hDll) ? Это ситуация с ошибкой, т.к. в нормальном случае возвращается ненулевое значение.
Название: Re: LoadLibrary
Отправлено: Александр Ривилис от 24-05-2016, 17:16:43
Взял первую попавшуюся dll и переименовал её в test.dll. Проверил следующий код. Всё работает.

Код - C++ [Выбрать]
  1. #include <windows.h>
  2. #include <Core/CoreAll.h>
  3. #include <Fusion/FusionAll.h>
  4. #include <CAM/CAMAll.h>
  5.  
  6. using namespace adsk::core;
  7. using namespace adsk::fusion;
  8. using namespace adsk::cam;
  9.  
  10. Ptr<Application> app;
  11. Ptr<UserInterface> ui;
  12.  
  13. extern "C" XI_EXPORT bool run(const char* context)
  14. {
  15.         app = Application::get();
  16.  
  17.         if (!app)
  18.                 return false;
  19.  
  20.         ui = app->userInterface();
  21.         if (!ui)
  22.                 return false;
  23.  
  24.   HMODULE hdll = LoadLibraryW(L"C:\\test.dll");
  25.   if (hdll) {
  26.            ui->messageBox("Dll loaded");
  27.   } else {
  28.            ui->messageBox("Dll not loaded");
  29.   }
  30.  
  31.         return true;
  32. }
  33.  
  34. extern "C" XI_EXPORT bool stop(const char* context)
  35. {
  36.         if (ui)
  37.         {
  38.                 ui->messageBox("in stop");
  39.                 ui = nullptr;
  40.         }
  41.  
  42.         return true;
  43. }
  44.  
  45.  
  46. #ifdef XI_WIN
  47.  
  48. #include <windows.h>
  49.  
  50. BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved)
  51. {
  52.         switch (reason)
  53.         {
  54.         case DLL_PROCESS_ATTACH:
  55.         case DLL_THREAD_ATTACH:
  56.         case DLL_THREAD_DETACH:
  57.         case DLL_PROCESS_DETACH:
  58.                 break;
  59.         }
  60.         return TRUE;
  61. }
  62.  
  63. #endif // XI_WIN

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F54905%2F7842324.6%2F0_126283_b50b7fe0_orig.png&hash=979062decd81e1f69fcdac1e2641242f)

Название: Re: LoadLibrary
Отправлено: dr.B00 от 24-05-2016, 22:04:39
Александр Ривилис,
Большое спасибо. Когда указал полный путь к dll получилось (хотя в Include directories место хранения было прописано).
Название: Re: LoadLibrary
Отправлено: Александр Ривилис от 24-05-2016, 22:56:49
(хотя в Include directories место хранения было прописано)
Для LoadLibrary Include directories не указ. Более того это информация используется на стадии компиляции C++, а не для выполняющегося add-in. Читай описание LoadLibrary: https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175