Что произойдет, если я нарушу требования, предъявляемые к ProgID?
В этой статье MSDN говорится, что любой ProgID должен соответствовать нескольким формальным требованиям, включая ограничение длины. Однако ничего не сказано о том, что произойдет, если они будут нарушены.
Я нашел несколько мест в нашей кодовой базе, в которых ProgID длиннее 39 символов, но для них все вроде бы работает нормально, включая ProgIDFromCLSID() и CLSIDFromProgID().
Поскольку нарушить эти требования довольно просто, было бы очень интересно узнать, каковы реальные возможные последствия таких нарушений?
2 ответа
Я думаю, что вы получите неопределенное поведение. Это может варьироваться от нормального функционирования до сбоев, поедания котят, принесения в жертву первенцев и т. Д.
Более того, некоторые требования, вероятно, говорят вам несколько вещей:
- Не более 39 символов: другое программное обеспечение может использовать буфер фиксированного размера в 40 символов для хранения ProgID. Поэтому они будут иметь только первые 39 и могут не найти ваш ProgID, если он длиннее.
- Не начинать с цифры; не содержать знаков препинания, кроме точек: опять же, это контракт. Программное обеспечение может полагаться на это для проверки, что ProgID откуда-то получаются, что они действительно ProgID, а не что-то совершенно иное, например.
Windows может не укусить вас сразу, но могут и другие вещи.
У меня пока нет ответа - я сам исследую эту проблему - но я сталкивался с этим:
В управляемом коде обычной практикой является указание подробных пространств имен и типов, но это может легко превысить максимально допустимую длину ProgId (39 символов). Если вы сделаете это, никаких указаний на проблему не будет, пока вы не попытаетесь зарегистрировать надстройку в Excel - и даже тогда Excel просто скажет вам, что надстройка недействительна, не предоставляя никаких дополнительных подробностей. Чтобы избежать этой проблемы, вы всегда должны явно указывать ProgId, используя атрибут ProgId. Также помните, что подчеркивания допустимы в управляемом коде, но недопустимы в ProgIds.
в блоге Эндрю Уайтчепела, который предполагает, что предел может быть больше, чем просто соглашение, применяемое программистами, использующими короткие буферы.