Получение доступа к каталогам поддержки и проекта
Я получил недавно запрос о том, как програмно получить доступ к каталогам поддержки и файлам проекта, которые доступны на вкладке Свойства/Файлы.
Мы можем воспользоваться ActiveX API AcadPreferences.Files для получения доступа к каталогам поддержки и файлам проекта.
Чтобы получить информацию о каталогах поддержки можно также прочитать системную переменную «ACADPREFIX» или выполнить следующий код:
- void TestProj()
- {
- HRESULT hr;
- try
- {
- AutoCAD::IAcadApplication *pAcad =NULL;
- hr = NOERROR;
- LPUNKNOWN pUnk = NULL;
- LPDISPATCH pAcadDisp = acedGetIDispatch(TRUE);
- if(pAcadDisp==NULL)
- return ;
- hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,
- (void**)&pAcad);
- pAcadDisp->Release();
- if (FAILED(hr))
- return;
- if (pAcad)
- {
- AutoCAD::IAcadPreferences* pPreferences = NULL;
- hr = pAcad->get_Preferences(&pPreferences);
- if(FAILED(hr)) return;
- pAcad->Release();
- AutoCAD::IAcadPreferencesFiles* pPreferencesFiles = NULL;
- hr = pPreferences->get_Files(&pPreferencesFiles);
- if(FAILED(hr)) return;
- if(pPreferencesFiles)
- {
- /* Для доступа к каталогу проекта */
- BSTR projectFilePath, supportPath;
- /* Создан Testproject и добавлен путь"C:/Temp */
- pPreferencesFiles->GetProjectFilePath(_bstr_t("TESTPROJECT"),
- &projectFilePath);
- std::wstring ps(projectFilePath,SysStringLen(projectFilePath));
- acutPrintf(_T("\nКаталог проекта: %s"), ps.c_str());
- /* Получаем список каталогов в путях доступа */
- pPreferencesFiles->get_SupportPath(&supportPath);
- std::wstring ws(supportPath,SysStringLen(supportPath));
- acutPrintf(_T("\nПути доступа : %s"),ws.c_str());
- }
- }
- }
- catch(...)
- {
- return;
- }
- }
Код выше позволяет получить путь к текущему проекту, созданному в Приложении. Но нет API позволяющее получить список всех проектов созданных в приложении. Так что нам придётся воспользоваться чтением из реестра.
Механизм чтения реестра описан здесь.
- /* Перечисляем все доступные проекты в списке */
- #define MAX_KEY_LENGTH 255
- #define MAX_VALUE_NAME 16383
- void QueryKey(HKEY hKey)
- {
- TCHAR achKey[MAX_KEY_LENGTH]; // буфер имени
- DWORD cbName; // размер строки
- TCHAR achClass[MAX_PATH] = TEXT(""); // буфер класса
- DWORD cchClassName = MAX_PATH; // размер строки
- DWORD cSubKeys = 0; // число ключей
- DWORD cbMaxSubKey; // длина самого длинного ключа
- DWORD cchMaxClass; // длина самой длинной строки класса
- DWORD cValues; // число значений ключа
- DWORD cchMaxValue; // самое длинное значение
- DWORD cbMaxValueData; // самое длинное значение данных
- DWORD cbSecurityDescriptor; // длина дескриптора защиты
- FILETIME ftLastWriteTime; // дата последнего изменения
- DWORD i, retCode;
- TCHAR achValue[MAX_VALUE_NAME];
- DWORD cchValue = MAX_VALUE_NAME;
- // Получим имя класса и счетчик значений.
- retCode = RegQueryInfoKey(
- hKey, // метка ключа
- achClass, // буфер имени класса
- &cchClassName, // длина строки класса
- NULL, // зарезервировано
- &cSubKeys, // число ключей
- &cbMaxSubKey, // длина самого длинного ключа
- &cchMaxClass, // длина самой длинной строки класса
- &cValues, // число значений для ключа
- &cchMaxValue, // самое длинное значение
- &cbMaxValueData, // самое длинное значение данных
- &cbSecurityDescriptor, // длина дескриптора защиты
- &ftLastWriteTime); // дата последнего изменения
- // Перебираем все ключи до тех пор, пока RegEnumKeyEx не выдаст ошибку.
- if (cSubKeys)
- {
- printf("\nЧисло ключей: %d\n", cSubKeys);
- for (i = 0; i<cSubKeys; i++)
- {
- cbName = MAX_KEY_LENGTH;
- retCode = RegEnumKeyEx(hKey, i,
- achKey,
- &cbName,
- NULL,
- NULL,
- NULL,
- &ftLastWriteTime);
- if (retCode == ERROR_SUCCESS)
- {
- acutPrintf(TEXT("(%d) %s\n"), i + 1, achKey);
- }
- }
- }
- // Перебираем значения ключа.
- if (cValues)
- {
- printf("\nЧисло значений: %d\n", cValues);
- for (i = 0, retCode = ERROR_SUCCESS; i<cValues; i++)
- {
- cchValue = MAX_VALUE_NAME;
- achValue[0] = '\0';
- retCode = RegEnumValue(hKey, i,
- achValue,
- &cchValue,
- NULL,
- NULL,
- NULL,
- NULL);
- if (retCode == ERROR_SUCCESS)
- {
- acutPrintf(TEXT("(%d) %s\n"), i + 1, achValue);
- }
- }
- }
- }
- void TestList()
- {
- HKEY hTestKey;
- /* Явно задаём путь, R20.1 - соответствует ACAD версии 2016
- ACAD-F001:419 : Код для "чистого" русского AutoCAD
- */
- /* Для получения полной информации:
- http://adndevblog.typepad.com/autocad/2013/08/registry-values-for-productid-and-localeid-for-autocad.html */
- if (RegOpenKeyEx(HKEY_CURRENT_USER,
- TEXT("Software\\Autodesk\\AutoCAD\\R20.1\\ACAD-F001:419\\Profiles\\acad\\Project Settings"),
- 0,
- KEY_READ,
- &hTestKey) == ERROR_SUCCESS
- )
- {
- QueryKey(hTestKey);
- }
- RegCloseKey(hTestKey);
- }
Результат выполнения программы:
Можете также посмотреть, как изменить путь к файлу проекта:
http://adndevblog.typepad.com/autocad/2012/12/setting-the-project-file-search-path.html
Аналогичный механизм для изменения пути к каталогам поддержки:
- virtual HRESULT __stdcall put_SupportPath (
- /*[in]*/ BSTR orient ) = 0;
Обсуждение: http://adn-cis.org/forum/index.php?topic=3296
Опубликовано 23.12.2015Отредактировано 23.12.2015 в 14:16:54