【问题标题】:Convert an Icon to IPicture in .NET 4.0?在 .NET 4.0 中将图标转换为 IPicture?
【发布时间】:2010-02-05 21:33:13
【问题描述】:

其中一个标准且(在某种程度上)受支持的答案是使用 Microsoft.VisualBasic.Compatibility 程序集中的 Support.IconToIPicture。但是,在 .NET 4.0 中,“This API is now obsolete”。

是的,有各种各样的solutions,但我认为如果 Microsoft 正在淘汰这种方法,将会有另一种“受支持”的替代方法。

【问题讨论】:

    标签: .net vb6 .net-4.0 ole system.drawing


    【解决方案1】:

    我相信,这个 API 已经过时了,因为 IPicture 是一个 OLE 接口。通过使用它,您可以潜入微软不希望您进入的非托管世界。您可以通过调用重现该行为 IntPtr aHIcon = Icon.GetHicnFromIcon(yourIcon);

    那么你需要把这个句柄传递给OleCreatePictureIndirect(代码是C++):

    PICTDESC aDesc;
    aDesc.cbSizeofstruct = sizeof PICTDESC;
    aDesc.picType = PICTYPE_ICON;
    aDesc.icon.icon = aHIcon;
    
    IPicture * aPict = 0;
    OleCreatePictureIndirect(&aDesc, __uuidof(IPicture), TRUE, (void **) &aPict);
    

    唯一的困难——您需要提供一个 COM 互操作代码来包装 C++ 结构和函数调用。

    【讨论】:

    • @Dan:正如你所说,你正在处理 OLD COM 服务器,这就是为什么你需要一个过时的 API。
    • @Dan:别误会我的意思。我的观点是:您正在处理遗留代码,不要指望新语言无限期地支持遗留代码。只需对调用使用 3.5 DLL 包装器并继续。
    • 正确,丹;因此,如果您计划将调用 Support.IconToIPicture() 的 VB(.net) 代码移至框架 4,那么您应该使用与此答案类似的内容替换该调用 - 使用 .Net COM 互操作。您是否正在寻找显示在 VB(.net) 中完成 COM 互操作的答案?我不确定您正在寻找什么类型的答案。顺便说一句,关于它为何被放弃的“线索”在消息“Microsoft.VisualBasic.Compatibility.* 类已过时,仅在 32 位进程中受支持。”
    • 好的,我想我明白了;我建议 Thomas Quinn 的解决方案看起来很完美,你在问题中提到了这一点,所以你知道它。我怀疑他们(MS)正在淘汰 VB6 兼容性的东西,因为对 VB6 转换的需求已经很少(更少)了,而且维护代码的成本很高。在这种情况下,我不希望替换过时的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2013-04-10
    • 1970-01-01
    • 2012-07-23
    • 2023-03-13
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多