我在尝试维护的一些代码中有一个奇怪的警告。我目前正在其当前环境(Visual C++ 6.0,是的,我知道,古老的)中对其进行测试,然后再将其升级到更现代的 VC++ 版本。我不明白这个警告,以及它可能对我正在编译的 EXE 目标产生什么影响。在编译期间,我在构建选项卡中获得此输出:
Processing C:\OSDK\Libraries\PSDll\OSDKDefs.idl
OSDKDefs.idl
.\Server\Interfaces\InterfaceDef.idl(109) : warning MIDL2346 : the specified lcid is different from previous specification
Compiling...
上述 IDL 文件是由供应商提供的 IDL 文件的略微修改版本,不再为上述库提供任何支持。我相信 IDL 文件中的这条评论是由该项目的前维护者添加的,他已经破解了这个 IDL 文件。我的问题是,我可以通过将 lcid 更改回注释中的值来消除警告,可能会重新引入此 idl 文件的原始修饰符想要避免的一些不需要的问题。 什么是 lcid,lcid(0x409) 和 lcid(0x09) 的行为有什么区别?正在切换值为 0x400 hex 的单个位,但该位有什么作用?
导致警告的行在下面标记和注释,以前的 lcid(0x409) 更改为 lcid(0x09) 以“兼容”该供应商为其 DCOM/COM 代码提供的某种测试工具,该工具在下面的评论。
//
// Component and type library descriptions
//
[
uuid(bbf92ab1-5031-40c2-864d-1c301f51d0ce),
// mvs04042000 - Changed back the lcid from 0x409 to 0x09. Else we have problems
// connecting from the PowerTool.
lcid(0x09), /// <<----- WARNING HERE
version(7.16),
helpfile("OsdkTlb.hlp"),
helpstring("OPC Server 7.16 Library"),
helpcontext(0x00000010)
]
library ED3Drv
{
importlib("stdole32.tlb");
[
uuid(b66ac2ca-d99e-4319-8fc0-08c0b65e65df),
appobject
]
coclass ED3Server
{
[default] interface IED3Driver;
interface IDriver;
interface IDriverMessage;
interface IDataScopeConnect;
interface IDispatch;
[source] interface IDataScopeSink;
};
};
上面的 IDL 是工具包的一部分,该工具包旨在帮助人们编写符合称为 OPC(用于过程控制的 OLE)规范的 C++ DCOM 客户端和服务器。