这篇 MSDN 文章指出,任何 ProgID 都必须满足几个正式要求,包括长度限制。但是,没有提及如果违反这些会发生什么。
我在我们的代码库中发现了几个地方的 ProgID 长度超过 39 个字符,但对它们来说一切似乎都正常,包括 ProgIDFromCLSID() 和 CLSIDFromProgID()。
由于违反这些要求很容易,因此知道这种违反的真正可能后果是什么会很有趣?
这篇 MSDN 文章指出,任何 ProgID 都必须满足几个正式要求,包括长度限制。但是,没有提及如果违反这些会发生什么。
我在我们的代码库中发现了几个地方的 ProgID 长度超过 39 个字符,但对它们来说一切似乎都正常,包括 ProgIDFromCLSID() 和 CLSIDFromProgID()。
由于违反这些要求很容易,因此知道这种违反的真正可能后果是什么会很有趣?
我猜你得到的是未定义的行为。这可以从正常功能到崩溃、小猫被吃掉、长子被牺牲等等。
更重要的是,一些要求可能会告诉您一些事情:
Windows 可能不会立即咬你,但其他事情可能会。
我还没有答案——我自己也在研究这个问题——但我确实遇到了这个问题:
托管代码中的常见做法是指定详细的命名空间和类型名,但这很容易超过 ProgId 的最大允许长度(39 个字符)。如果您这样做,则在您尝试使用 Excel 注册加载项之前,不会有任何问题的迹象——即使这样,Excel 也会简单地告诉您加载项无效,而不会提供任何更多详细信息。为避免此问题,您应始终使用 ProgId 属性显式指定 ProgId。还要记住,下划线在托管代码中是合法的,但在 ProgIds 中是非法的。
在Andrew Whitechapel 的博客中,这表明限制可能不仅仅是程序员使用短缓冲区强制执行的约定。