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

09/07/2013

Как использовать класс AcadAppInfo для чтения и записи информации из реестра

Вопрос:
Как можно использовать класс AcadAppInfo для чтения и записи информации из (в) реестр?

Ответ:
Следующий код подразумевает, что вы загрузили пример POLYSAMP в AutoCAD. (Вы можете найти этот пример в каталоге ObjectARX  SDK\Samples\entity\). Измените имя приложения в аргументе функции setAppName() чтобы получить собственную информацию вашего приложения из реестра.

Вы можете использовать утилиту RegEdit для того чтобы увидеть что производит тестовый код с ветками AutoCAD реестра.

ПРИМЕЧАНИЯ:

- Вы должны создать для загрузки по требованию вашего конкретного приложения ветки и вложенные ключи и назначить правильные значения, как показано ниже во фрагменте кода. В противном случае будет выведено сообщение об ошибке в первом блоке кода при получении информации из реестра. Это делается в фрагменте, который озаглавлен как “Создаем ключи и значения для загрузки по требованию при запуске команды”.

- Приложение не может создавать ключи в ветках. Обратитесь к документации MSDN по функции RegCreateKeyEx() для более подробной информации.

 

Код - C++: [Выделить]
  1. static void testregisterinfo()
  2. {  
  3.     ////////////////////////////////////////////
  4.     // Читаем информацию из реестра для примера POLYSAMP.
  5.    ////////////////////////////////////////////
  6.    AcadAppInfo info ;
  7.     //  Устанавливаем имя приложения
  8.    info.setAppName (L"AsdkPolyCAD");  
  9.     //  Читаем информацию из реестра
  10.    assert( Acad::eOk == info.readFromRegistry () ); 
  11.    //  Выводим имя файла приложения
  12.    acutPrintf(L"Имя модуля :%s", info.moduleName()); 
  13.   
  14.    ////////////////////////////////////// /
  15.    // Создаем ключи и значения для загрузки
  16.    // по требованию при запуске команды
  17.    /////////////////////////////////////
  18.    const TCHAR pAppRegPath[] =
  19.        L"SOFTWARE\\MyComany\\MyProduct\\MyApp\\";
  20.    HKEY rkey;
  21.    DWORD result;
  22.    LONG status = RegCreateKeyEx(
  23.        HKEY_LOCAL_MACHINE,
  24.        (LPCWSTR)pAppRegPath, 0, L"",
  25.        REG_OPTION_NON_VOLATILE,
  26.        KEY_WRITE,
  27.        NULL,
  28.         &rkey,
  29.        &result);
  30.    if (status != ERROR_SUCCESS)
  31.     return;
  32.    MessageBox(NULL,L"Тест",L"Тест",0);
  33.  
  34.    HKEY prodKey;
  35.    status = RegCreateKeyEx(rkey,
  36.        L"TestApp1",
  37.        0,
  38.        L"",
  39.        REG_OPTION_NON_VOLATILE,
  40.        KEY_WRITE,
  41.        NULL,
  42.        &prodKey,
  43.        &result);
  44.    RegCloseKey(rkey);
  45.    if (status != ERROR_SUCCESS)
  46.     return;
  47.  
  48.    HKEY cmdKey;
  49.    status = RegCreateKeyEx(prodKey,
  50.                         L"Commands",
  51.                         0,
  52.                         L"",
  53.                     REG_OPTION_NON_VOLATILE,
  54.                     KEY_WRITE,
  55.                     NULL,
  56.                     &cmdKey,
  57.                     &result);
  58.    if (status == ERROR_SUCCESS) {
  59.     RegSetValueEx(cmdKey,
  60.         L"MyCommand1",
  61.         0,
  62.         REG_SZ,
  63.         (const unsigned char*)"CMD1",
  64.         5);
  65.     RegSetValueEx(cmdKey, L"MyCommand2",
  66.         0,
  67.         REG_SZ,
  68.         (const unsigned char*)"CMD2",
  69.         5);
  70.     RegCloseKey(cmdKey);
  71.    }
  72.    HKEY loaderKey;
  73.    status = RegCreateKeyEx(prodKey,
  74.                     L"Loader",
  75.                     0,
  76.                     L"",
  77.                   REG_OPTION_NON_VOLATILE,
  78.                   KEY_WRITE,
  79.                   NULL,
  80.                   &loaderKey,
  81.                   &result);
  82.  
  83.    if (status == ERROR_SUCCESS) {
  84.     RegSetValueEx(loaderKey,
  85.         L"MODULE",
  86.         0,
  87.         REG_SZ,
  88.         (const unsigned char*)"C:\\TEMP\\MyApp.ARX",
  89.         sizeof("C:\\TEMP\\MyApp.ARX")+1);
  90.     RegCloseKey(loaderKey);
  91.    }
  92.  
  93.    HKEY nameKey;
  94.    status = RegCreateKeyEx(prodKey,
  95.                     L"Name",
  96.                     0,
  97.                     L"",
  98.                 REG_OPTION_NON_VOLATILE,
  99.                 KEY_WRITE,
  100.                 NULL,
  101.                 &nameKey,
  102.                 &result);
  103.    RegCloseKey(prodKey);
  104.    if (status != ERROR_SUCCESS)
  105.     return;
  106.  
  107.    RegSetValueEx(nameKey,
  108.        L"MyApp Name",
  109.        0,
  110.        REG_SZ,
  111.        (const unsigned char*)"MyCAD", 6);
  112.  
  113.    RegCloseKey(nameKey);
  114.  
  115.    /////////////////////////////////////////////////
  116.    // Запишем нашу собственную информацию в реестр.
  117.    /////////////////////////////////////////////////
  118.    AcadAppInfo info2 ;
  119.    // AppName находится под ключом AutoCAD\Applications.
  120.    // Устанавливаем имя приложения 
  121.    info2.setAppName (L"TestApp1");  
  122.    // Это просто строка, содержимое которой не имеет значения.
  123.    info2.setAppDesc(L"Описание моего приложения.");
  124.    // Устанавливаем путь загрузки.
  125.    info2.setModuleName(L"C:\\TEMP\\MyApp.ARX");
  126.    // Определим в каких случаях приложение должно автоматически загружаться.
  127.    info2.setLoadReason( AcadApp::LoadReasons(   
  128.                     AcadApp::kOnProxyDetection |
  129.                     AcadApp::kOnCommandInvocation |
  130.                     AcadApp::kOnLoadRequest) );
  131.  
  132.    assert( Acad::eOk == info2.writeToRegistry() );
  133.  
  134. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/02/using-the-acadappinfo-class-to-read-and-write-registry-information.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=129.0

Опубликовано 09.07.2013
Отредактировано 04.08.2013 в 16:34:17