Windows 如果我违反了对ProgIDs的要求,会发生什么?

Windows 如果我违反了对ProgIDs的要求,会发生什么?,windows,com,com-interop,ole,progid,Windows,Com,Com Interop,Ole,Progid,声明任何ProgID必须满足几个正式要求,包括长度限制。但是,如果违反了这些规定,将会发生什么事情,我们对此只字不提 我在我们的代码库中发现了几个progid超过39个字符的地方,但它们似乎一切都正常,包括ProgIDFromCLSID和CLSIDFromProgID 由于违反这些要求非常容易,因此了解此类违反行为的真正可能后果将非常有趣。我猜您得到的是未定义的行为。从正常功能到崩溃,小猫被吃掉,第一胎被牺牲,等等 更重要的是,一些需求可能会告诉您一些事情: 不超过39个字符:其他软件可能使用4

声明任何ProgID必须满足几个正式要求,包括长度限制。但是,如果违反了这些规定,将会发生什么事情,我们对此只字不提

我在我们的代码库中发现了几个progid超过39个字符的地方,但它们似乎一切都正常,包括ProgIDFromCLSID和CLSIDFromProgID

由于违反这些要求非常容易,因此了解此类违反行为的真正可能后果将非常有趣。

我猜您得到的是未定义的行为。从正常功能到崩溃,小猫被吃掉,第一胎被牺牲,等等

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

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

我猜你得到的是未定义的行为。从正常功能到崩溃,小猫被吃掉,第一胎被牺牲,等等

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

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

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

这是托管代码中的常见做法 指定名称空间和类型名的步骤 这是冗长的,但很容易理解 超过允许的最大长度 ProgId 39个字符。如果你这样做 这个,没有任何迹象表明 问题,直到您尝试注册 使用Excel加载项–即使如此, Excel只是告诉您外接程序 无效,不提供更多信息 细节为了避免这个问题,您需要 应始终指定一个ProgId 显式地,使用ProgId 属性还记得吗 下划线在托管代码中是合法的, 但在ProgIds中是非法的


在一个例子中,这表明限制可能不仅仅是程序员使用短缓冲区强制执行的约定。

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

这是托管代码中的常见做法 指定名称空间和类型名的步骤 这是冗长的,但很容易理解 超过允许的最大长度 ProgId 39个字符。如果你这样做 这个,没有任何迹象表明 问题,直到您尝试注册 使用Excel加载项–即使如此, Excel只是告诉您外接程序 无效,不提供更多信息 细节为了避免这个问题,您需要 应始终指定一个ProgId 显式地,使用ProgId 属性还记得吗 下划线在托管代码中是合法的, 但在ProgIds中是非法的


这意味着限制可能不仅仅是程序员使用短缓冲区强制执行的约定。

这些要求违反了您的要求。sry,不能抵抗看起来他们不想马上侵犯我,而是等着什么……这些要求侵犯了你。sry,不能抵抗看起来他们不想马上违反我的要求,而是等待一些事情……是的,一些程序对progids和clsids使用相同的缓冲区,在{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx}形式中是38字节。是的,一些程序对progids和clsids使用相同的缓冲区,在{xxxxxxxx-xxxx-xxxx-xxxx-XXXXXXXXXXXXXX}表格。