2009-11-18 32 views
1

This MSDN article指出任何ProgID必须满足几个形式要求,包括长度限制。然而,没有人会说如果这些事情被侵犯会发生什么。如果我违反了对ProgIDs的要求,会发生什么情况?

我在我们的代码库中发现了ProgID长度超过39个字符的地方,仍然一切似乎都适合它们,包括ProgIDFromCLSID()和CLSIDFromProgID()。

由于违反这些要求非常容易,因此知道这些违规行为的真正可能后果是非常有趣的。

+1

teh的要求违反了你。 (sry,无法抗拒) – mpen 2009-11-18 08:25:55

+0

看起来他们不想立刻违背我的意思,而是等待某件事...... – sharptooth 2009-11-18 08:27:02

回答

3

我想你得到的是未定义的行为。这可以从正常运作的范围崩溃,小猫被吃掉,牺牲的firstborn,& c。

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

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

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

+0

是的,某些程序对progids和clsids使用相同的缓冲区(这是38字节{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}表单。 – 2009-11-18 17:42:46

1

我没有答案,但 - 我研究这个问题,我自己 - 但我没有碰到过这样的:

这是在托管代码 常见的做法是指定命名空间和typenames 这是详细的,但这可以很容易地 超过一个 ProgId(39个字符)的最大允许长度。如果你这样做 这一点,有没有 问题的指示,直到你尝试注册 加载项与Excel - 即使如此, Excel中简单地告诉你,外接 是无效的,没有提供任何更多的 详细。为避免此问题,您应使用ProgId 属性明确指定ProgId 。还请记住 下划线在托管代码中是合法的, 但在ProgIds中是非法的。

blog by Andrew Whitechapel这表明,限制可能不仅仅是程序员使用短缓冲区执行的惯例。

相关问题