1

这篇 MSDN 文章指出,任何 ProgID 都必须满足几个正式要求,包括长度限制。但是,没有提及如果违反这些会发生什么。

我在我们的代码库中发现了几个地方的 ProgID 长度超过 39 个字符,但对它们来说一切似乎都正常,包括 ProgIDFromCLSID() 和 CLSIDFromProgID()。

由于违反这些要求很容易,因此知道这种违反的真正可能后果是什么会很有趣?

4

2 回答 2

4

我猜你得到的是未定义的行为。这可以从正常功能到崩溃、小猫被吃掉、长子被牺牲等等。

更重要的是,一些要求可能会告诉您一些事情:

  • 不超过 39 个字符:其他软件可能使用 40 个字符的固定大小缓冲区来存储 ProgID。因此,他们将只有前 39 个,如果它更长,可能找不到您的 ProgID。
  • 不以数字开头;除句点外不包含标点符号:同样,这是一份合同。例如,软件可能会依赖它来验证它从某个地方获得的 ProgID,它们确实是 ProgID,而不是完全不同的东西。

Windows 可能不会立即咬你,但其他事情可能会。

于 2009-11-18T08:27:47.663 回答
2

我还没有答案——我自己也在研究这个问题——但我确实遇到了这个问题:

托管代码中的常见做法是指定详细的命名空间和类型名,但这很容易超过 ProgId 的最大允许长度(39 个字符)。如果您这样做,则在您尝试使用 Excel 注册加载项之前,不会有任何问题的迹象——即使这样,Excel 也会简单地告诉您加载项无效,而不会提供任何更多详细信息。为避免此问题,您应始终使用 ProgId 属性显式指定 ProgId。还要记住,下划线在托管代码中是合法的,但在 ProgIds 中是非法的。

Andrew Whitechapel 的博客中,这表明限制可能不仅仅是程序员使用短缓冲区强制执行的约定。

于 2009-12-28T21:27:17.110 回答