MIDL меняет регистр идентификатора в созданную библиотеку типов

Переводы статьи Переводы статьи
Код статьи: 220137
Развернуть все | Свернуть все

В этой статье

Проблема

При наличии двух идентификаторов, которые отличаются только регистром, в соответствии с первым в случае изменения регистра, второй идентификатора.

Причина

Библиотеки IDL и типа не учитывается при проектировании. Код Ole-автоматизации, который вызывается MIDL для создания библиотеки типов занимает первое вхождение имя и все последующие вхождения одного и того же имени в IDL, даже в том случае, если он находится в другом контексте, должны совпадать.

Решение

Ниже приведены методы решения проблемы можно избежать этой проблемы.
  • В случае использования одного IDL-файл импорта на другой, вероятность этого происходит больше. Вместо импорта IDL-файлы в другой IDL, импорт соответствующей библиотеке типов.
  • Убедитесь, что тем же именем уже не присутствует в IDL-файл при Представляем новый идентификатор.
  • Сопоставьте идентификатор, созданный в библиотеке типов компонентов документацию. Это действительно не слишком сложными, поскольку все идентификаторы, которые отличаются только регистром будет находиться в другом контексте, один метод, другой параметр, структура и так далее. Это поможет избежать несоответствия в документации компонента.

Статус

Такое поведение является особенностью данного продукта..

Дополнительная информация

IDL-файл имеет два разных идентификаторов с одинаковым названием, но отличаются только в случае, а затем MIDL созданные библиотеки типов второй идентификатор изменится так же как первый из них.

Действия для воспроизведения поведения:

  1. Создайте файл IDL (name.idl). См. следующий пример:
    // Test program to demonstrate capitalization bugs in MIDL 5.02.0235
    import "oaidl.idl";
    import "ocidl.idl";
    
       [
          uuid(DB9DDB0D-8834-11D1-8278-00A024A41CC8),
          dual,
          oleautomation,
       ]
       interface Interface1 : IDispatch {
          [ id(4), helpstring("") ]
          HRESULT OtherMethod (
             // This parm name will affect the case of the subsequent method name.
             [in] VARIANT_BOOL mYnAme );
       };
    
    
       [
          uuid(DB9DDB0C-8834-11D1-8278-00A024A41CC8),
          dual,
          oleautomation,
       ]
       interface Interface2 : IDispatch {
          [ id(5), helpstring("") ]
          // The method name gets changed.
          HRESULT MyName ();
       };
    
    
    [  uuid(2A216780-BC52-11D2-B94F-00C04F81B63A), version(1.0),
    ]
    library MIDLTST
    {
       importlib("stdole32.tlb");
    
       [
          uuid(65B5C950-883D-11D1-8278-00A024A41CC8),
          helpstring("Exercise various supported types.")
       ]
       coclass MIDLTest {
          [default] interface Interface1;
          interface Interface2;
       };
    };
    						
  2. Для создания библиотеки типов с помощью компилятора MIDL. С помощью команды MIDL name.idl
  3. Откройте библиотеку, созданный тип в OLEVIEW. См. следующий вывод OLEVIEW.
    // Generated .IDL file (by the OLE/COM Object Viewer)
    // 
    // typelib filename: <could not determine filename>
    
    [
      uuid(2A216780-BC52-11D2-B94F-00C04F81B63A),
      version(1.0)
    ]
    library MIDLTST
    {
        // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
        importlib("STDOLE2.TLB");
    
        // Forward declare all types defined in this typelib
        interface Interface1;
        interface Interface2;
    
        [
          uuid(65B5C950-883D-11D1-8278-00A024A41CC8),
          helpstring("Exercise various supported types.")
        ]
        coclass MIDLTest {
            [default] interface Interface1;
            interface Interface2;
        };
    
        [
          odl,
          uuid(DB9DDB0D-8834-11D1-8278-00A024A41CC8),
          dual,
          oleautomation
        ]
        interface Interface1 : IDispatch {
            [id(0x00000004)]
            HRESULT OtherMethod([in] VARIANT_BOOL mYnAme);
        };
    
        [
          odl,
          uuid(DB9DDB0C-8834-11D1-8278-00A024A41CC8),
          dual,
          oleautomation
        ]
        interface Interface2 : IDispatch {
            [id(0x00000005)]
            HRESULT mYnAme();
        };
    };
    
    						
  4. Здесь имя метода MyName в Interface2 был изменен на моеИмя.

Свойства

Код статьи: 220137 - Последний отзыв: 16 ноября 2010 г. - Revision: 2.0
Ключевые слова: 
kbbug kbpending kbmt KB220137 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:220137

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com