2009-11-18 71 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這表明,限制可能不僅僅是程序員使用短緩衝區執行的慣例。

相關問題