我有一个COM函数,期望object[]作为参数:
foo(object[] values)
Run Code Online (Sandbox Code Playgroud)
我想传递一些enum字段,所以我使用以下内容:
object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType));
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试传递fields给foo(...)ie [ foo(fields)]时,我收到一个错误:
"无法将类型为'SomeEnumType []'的对象强制转换为'system.Object []'.
谁能告诉我我做错了什么?
如果不使用boost::thread和boost::bind直接,有没有实现下面的代码等效的方法吗?
std::string func()
{
std::string str("Hello from async task!");
return str;
}
int main()
{
auto ftr = std::async(&func);
std::cout << "Hello from main!";
std::string str = ftr.get();
std::cout << str << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
具体而言,这一部分:auto ftr = std::async(&func);?
在excel COM interop(C#)中,有什么区别:
_sheet = (Excel._Worksheet)_wb.Worksheets["SheetName"];
Run Code Online (Sandbox Code Playgroud)
和
_sheet = (Excel._Worksheet)_wb.Sheets["SheetName"];
Run Code Online (Sandbox Code Playgroud)
?
从msdn看来它似乎IMessageFilter没有处理所有异常,例如,在某些点,办公室应用程序'暂停'它们的对象模型,此时它不能被调用并抛出:0x800AC472 (VBA_E_IGNORE)
为了解决这个问题,你必须把你的呼叫放在一个循环中并等待它成功:
while(true)
{
try
{
office_app.DoSomething();
break;
}
catch(COMException ce)
{
LOG(ce.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果每次调用office应用程序的对象模型都需要这个样板代码,那么实现中是否有任何意义IMessageFilter?
我想用C++编写一个excel RTD服务器,但除了这个http://weblogs.asp.net/kennykerr/archive/2008/12/02/Rtd5之外,还没有找到任何运气查找和完成如何操作的教程.aspx.
但是,由于我对这些东西不熟悉,我认为我需要更完整的东西.你们中的任何人都可以指向C++示例的方向吗?
谢谢
编辑:对于那些感兴趣的人,我发现了这个:http://www.codeproject.com/Articles/245265/Guide-to-Writing-Custom-Functions-in-Excel-Part-II.aspx
我想将文件的内容以及其他一些参数传递给Windows上的python脚本。
在linux上,我可以这样做:
less input.txt | my_script.py > output.txt
Run Code Online (Sandbox Code Playgroud)
在Windows上,我尝试了以下操作,但似乎不起作用:
more input.txt | python my_script.py > output.txt
Run Code Online (Sandbox Code Playgroud)
知道我在做什么错吗?
我有一个excel插件,当我从VS2010构建/运行时,它在调试和发布模式下工作正常.但是,当我使用Windows安装程序部署它时,它无法正常运行.
我不确定问题是什么,或者即使"调试"发布代码也会有所帮助.
关于我如何找到问题的任何提示?
编辑
我的意思是"操作不正常"是当我按下按钮等没有任何事情发生它只是挂起.
谢谢
我想IMessageFilter在Excel Addin 上启用我必须写入excel.我从这里举了一些例子说:
消息过滤器是每个线程,所以我们将此线程注册为消息过滤器(不是创建加载项的主线程 - 因为这是Excel的主线程
我的问题是,当一个计时器过去导致从ThreadPool线程调用写入方法时,我的系统写入excel ,因为它IMessageFilter不能访问RetryRejectedCall部分IMessageFilter,因为它存在于调用者线程而不是执行的生成者之间.计时器.
所以,我的问题是:有没有办法可以强制计时器的Elapsed事件在初始化计时器的同一个线程上运行?
编辑:
我的问题是,如何IMessageFilter在抛出拒绝/忙碌时捕获excel错误?
谢谢
我继巴尔托什卢斯基一些教程,这里我觉得这是非常有用的.但是,由于作者使用了C++ 11线程标准的just :: thread实现(我还没有),我现在决定使用boost线程,因为该教程的作者说它很简单.这样做.这似乎是本系列前三个教程的情况,但我遇到了第四个问题.这是我的代码:
#include <iostream>
#include <cassert>
#include <boost\thread.hpp>
#include <boost\thread\future.hpp>
void thFun(boost::promise<std::string> & prms)
{
std::string str("Hi from future!");
prms.set_value(str);
}
int main()
{
boost::promise<std::string> prms;
boost::unique_future<std::string> fut = prms.get_future();
boost::thread th(&thFun, std::move(prms)); // error C2248: 'boost::promise<R>::promise' : cannot access private member declared in class 'boost::promise<R>'
std::cout << "Hi from main!";
std::string str = fut.get();
std::cout << str << std::endl;
th.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以下行似乎引发了一个我不明白的问题:
boost::thread th(&thFun, std::move(prms));
Run Code Online (Sandbox Code Playgroud)
编译器抱怨的地方:
错误C2248:'boost :: promise :: promise':无法访问类'boost …
我想使用a System.Windows.Forms.Timer来确保在我正在创建的excel插件的UI线程上触发事件.我按如下方式构建计时器:
private System.Windows.Forms.Timer _timer;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Debug.WriteLine("ThisAddIn_Startup:" + Thread.CurrentThread.ManagedThreadId);
_timer = new System.Windows.Forms.Timer();
_timer.Tick += new EventHandler(TimerEventHandler);
_timer.Interval = 500;
}
Run Code Online (Sandbox Code Playgroud)
计时器是由我正在使用的库中的COM事件触发的:
private void OnEvent()
{
_timer.Start();
}
Run Code Online (Sandbox Code Playgroud)
然后我希望_timer在它滴答时调用以下方法:
public void TimerEventHandler(object sender, EventArgs args)
{
_timer.Stop();
Debug.WriteLine("Tick: " + Thread.CurrentThread.ManagedThreadId);
}
Run Code Online (Sandbox Code Playgroud)
据我所知,当我在Addin线程中创建计时器时,即使它是从另一个线程启动的(在这种情况下是COM事件),它应该触发它创建的线程,即插件线程.但是,这不会发生.
我已经在RTDServer我过去写过的这个确切的机制中实现了(正如Kenny Kerr所概述的那样)并且它按预期工作,但_timer在这种情况下从未打过.
我还阅读了其他SO文章指出相同的行为,无法弄清楚我的插件设置有什么不同?
编辑: 触发OnEvent()方法.