gpt4 book ai didi

c# - 使用 C++/CLI 将图片插入 Excel 并收到 100x 警告 C4691

转载 作者:行者123 更新时间:2023-11-28 07:08:08 26 4
gpt4 key购买 nike

我的任务是对现有的 C++/CLI(具有 Excel 自动化)应用程序(目标框架:.NET4.0,IDE:VS2010)进行“小”修改。任务:将几张图片 (*.jpg) 插入到 Excel 工作表中。我很高兴在 stackoverflow 上找到一个线程,其中正是用 C# 解决了这个任务。链接在这里: please see the very end of this question

在上面的线程中,我按照用户 JMK 的回答中提供的说明进行操作。代码编译没有错误并且可以工作!实际上,代码成功地将图片放入工作表中。不幸的是,我也收到了一百条 C4691 编译器警告。

我的代码:

    //attributes - used by several different methods
private:
Excel::Application^ xlApp;
Excel::_Workbook^ xlBook;
Excel::Workbooks^ xlBooks;
Excel::Sheets^ xlSheets;
Excel::_Worksheet^ xlSheet;
Excel::Range^ range;
String^ templateFilename;
String^ picFilename;

private: System::Void buttonRunExcel_Click(System::Object^ sender, System::EventArgs^ e)
{
//create the Excel Application
xlApp = gcnew Excel::Application();//55 C4691 compiler warnings for this line of code
xlBooks = xlApp->Workbooks;//no compiler warnings here

//open the Excel template - 30 C4691 compiler warnings for the next line of code
xlBook = xlApp->Workbooks->Open(templateFilename, Type::Missing, false, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing);

xlSheets = xlBook->Worksheets;//no compiler warnings here

//set the active worksheet to sheet 3
xlSheet = (Excel::_Worksheet^)xlSheets->Item[3];//no compiler warnings here

//insert the picture - 15 C4691 compiler warnings for the next line of code
xlSheet->Shapes->AddPicture(picFilename, Core::MsoTriState::msoFalse, Core::MsoTriState::msoCTrue, 100, 200, 640, 480);

我的引用资料:

    using namespace System::Reflection;
using namespace System::Runtime::InteropServices;
using namespace Microsoft::Office::Core;
using namespace Microsoft::Office::Interop::Excel;

示例编译器警告:

warning C4691: "Microsoft::Office::Core::Assistant": type referenced was expected in unreferenced assembly "office", type defined in current translation unit used instead. This diagnosis occurred while importing type 'Microsoft: Office:Interop:Excel:ApplicationClass' from Assembly "Microsoft.Office.Interop.Excel, Version = 12.0.0.0, culture = neutral, PublicKeyToken = 71e9bce111e9429c".

MSDN 对此编译器警告的描述并不是特别有用(对我而言)。我不想简单地忽略警告(愚蠢),也不想使用 pragma warning(马虎)“关闭”警告。

如何消除警告 C4691?非常感谢所有建议、评论,甚至(建设性的)批评。谢谢

最佳答案

    xlApp = gcnew Excel::Application();

这里有相当多的自动魔法,但实际上在 C++ IDE 中效果不是很好。与 VB.NET 和 C# IDE 不同,这些语言通常用于编写 Office 互操作代码。

Excel::Application 是一个接口(interface),而不是一个类。当然,永远不可能创建接口(interface)的实例,它是一种抽象类型。 C++/CLI 编译器当然知道这是不可能的,因此会寻找实现该接口(interface)的。它通过查找接口(interface)类型上的 [CoClassAttribute] 属性找到它,它指向 Excel::ApplicationClass,这是一个由类型库导入程序生成的合成 .NET 类。值得注意的是,IntelliSense 解析器并不知道这个技巧,并在语句下方添加了红色波浪线。您将通过自己进行替换来摆脱它:

    xlApp = gcnew Excel::ApplicationClass();

继续 C4691 警告。 Excel 类型库使用另一个 类型库,其中包含常见的 Office 类型声明。您显然已经弄清楚了这一点并正确地添加了对 MSO.DLL 的引用,从而在 Microsoft::Office::Core 命名空间中获取类型。但这是一个映射的命名空间名称,类型库名称实际上是“Office”,而不是“Microsoft.Office.Core”。

因此 C++/CLI 编译器注意到了差异,ApplicationClass 引用了 Office 类型库中名为 Assistant 的接口(interface),因此它期望名为“Office”的程序集可用。这是将类型库名称映射到程序集名称的正常方式。换句话说,它不知道 namespace 名称已被映射。它也不知道,它没有做那个映射。这是通过注册表项完成的。

这是一个警告而不是错误,因为它实际上最终证明是正确的,它确实正确地将它映射到可用的程序集引用之一。您希望使用的 Microsoft.Office.Core。这件事的正确发生有点像一场赌博,从技术上讲,您可能会忘记添加对 MSO.DLL 的引用并拥有另一个名为“Assistant”的互操作类型。 Boomshakalaka 如果您忽略警告然后使用界面。

所以继续吧,把你的激光设置为眩晕:

    #pragma warning(disable:4691)
using namespace Microsoft::Office;
using namespace Microsoft::Office::Interop;

我更改了 using 语句,您引用的语句是错误的,并且不允许使用“Excel::Application”和“Core::MsoTriState”,这是编译错误的另一个富有成效的来源。

关于c# - 使用 C++/CLI 将图片插入 Excel 并收到 100x 警告 C4691,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21452294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com