首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C++/CLI将图片插入Excel中,并得到100 x警告C4691

使用C++/CLI将图片插入Excel中,并得到100 x警告C4691
EN

Stack Overflow用户
提问于 2014-01-30 09:23:21
回答 1查看 579关注 0票数 0

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

在上面的线程中,我遵循了用户JMK在答复中提供的说明。代码编译时没有错误,而且工作正常!实际上,代码成功地将图片放置在工作表中。不幸的是,我还获得了100个C4691编译器警告。

我的代码:

代码语言:javascript
运行
复制
    //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);

}

我的推荐人:

代码语言:javascript
运行
复制
    using namespace System::Reflection;
using namespace System::Runtime::InteropServices;
using namespace Microsoft::Office::Core;
using namespace Microsoft::Office::Interop::Excel;

示例编译器警告:

警告C4691:“Microsoft::office::Core::助手”:在未引用的程序集"office“中预期引用类型,在当前翻译单元中定义的类型将被使用。此诊断是在从程序集导入类型'Microsoft: Office:Interop:Excel:ApplicationClass‘时发生的,版本= 12.0.0.0,区域性=中性,PublicKeyToken = 71e9bce111e9429c“。

MSDN对此编译器警告的描述并不特别有用(对我来说)。我不想简单地忽略警告(愚蠢),也不想使用语用警告(草率)“关闭”警告。

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

EN

回答 1

Stack Overflow用户

发布于 2014-01-30 13:04:32

代码语言:javascript
运行
复制
    xlApp = gcnew Excel::Application();

这里有相当数量的automagic,实际上在C++环境中没有那么好地工作。与VB.NET和C# IDE不同,通常用于编写Office代码的语言。

Excel:应用程序是一个接口,而不是一个类。当然,创建接口的实例是不可能的,它是一种抽象类型。当然,C++/CLI编译器知道这是不可能的,因此去寻找实现接口的类。通过查找接口类型上的CoClassAttribute属性,它指向Excel::ApplicationClass,这是一个由类型库导入程序生成的合成.NET类。值得注意的是,IntelliSense解析器不知道这个技巧,并在语句中添加了红色触发器。你可以通过自己做代换来摆脱它:

代码语言:javascript
运行
复制
    xlApp = gcnew Excel::ApplicationClass();

继续到C4691警告。Excel类型库使用另一个包含公共Office类型声明的类型库。显然,您已经知道了这一点,并正确地添加了对MSO.DLL的引用,在Microsoft::Office::Core命名空间中获得了类型。但这是一个映射的命名空间名称,类型库名称实际上是"Office",而不是"Microsoft.Office.Core“。

所以C++/CLI编译器注意到了这种差异,ApplicationClass引用了Office类型库中的一个名为助手的接口,因此它期望一个名为"Office“的程序集可用。这是将类型库名称映射到程序集名称的正常方式。换句话说,它不知道名称空间名称是否被映射。它也不知道,它没有做那种映射。这是由一个注册表项完成的。

这是一个警告,而不是一个错误,因为它最终确实是正确的,它确实正确地将其映射到可用的程序集引用之一。你想要用的那个,Microsoft.Office.Core。这种情况正确发生是一次小小的赌博,从技术上讲,您有可能忘记添加对MSO.DLL的引用,并有另一个名为“助手”的互操作类型。Boomshakalaka,如果您忽略警告,然后使用接口。

所以继续吧,让你的激光眩晕:

代码语言:javascript
运行
复制
    #pragma warning(disable:4691)
    using namespace Microsoft::Office;
    using namespace Microsoft::Office::Interop;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21452294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档