我不打算过多地讨论Excel方面的细节,我基本上从下面的例子中获得了代码:
C++应用程序自动化Excel (CppAutomateExcel)
solution1.cpp
因此,我在MSVC中尝试了这段代码,它编译了:
class foo { public: virtual void bar(){} };
int main()
{
void (foo::*p)() = &foo::bar;
}
但是,在Excel中捕获move函数地址的类似代码不起作用:
int main()
{
Excel::_ApplicationPtr spXlApp;
HRESULT hr = spXlApp.CreateInstance(__uuidof(Excel::Application));
Excel::WorkbooksPtr spXlBooks = spXlApp->Workbooks;
Excel::_WorkbookPtr spXlBook = spXlBooks->Add();
Excel::_WorksheetPtr spXlSheet = spXlBook->ActiveSheet;
HRESULT(Excel::_Worksheet::*pMove)(...) = &spXlSheet->Excel::_Worksheet::Move;
<... irrelevant code ...>
return 0;
}
这有以下编译器错误:
错误C2276:'&':绑定成员函数表达式的非法操作
如果我删除了&
,它会说我应该将它添加回:
错误C3867:'Excel::_Worksheet::Move':非标准语法;使用'&‘创建指向成员的指针
如能在此提供任何帮助,我们将不胜感激。
发布于 2016-07-12 12:11:40
您需要像下面这样声明方法指针:
// or whatever parameter type Move() actually uses...
void (Excel::_Worksheet::*pMove)(tagVARIANT, tagVARIANT) = &Excel::_Worksheet::Move;
然后,要真正调用pMove()
,您必须这样做:
Excel::_WorksheetPtr spXlSheet = ...;
(spXlSheet.Get()->*pMove)(...);
发布于 2016-07-12 10:47:52
你在问题中说“但是类似的代码.”然后显示代码,在代码中,您不做相同的事情。尝试使用与在较小示例中设置pMove
时使用的相同语法来设置p
。尝试类似于&Excel::_Worksheet::Move;
(没有"spXlSheet->")的东西。
如果您可以指定在设置函数指针时调用函数指针的对象的特定实例,我不知道这样的功能。从设置变量的位置删除spXlSheet->
后,在要调用函数指针的地方使用它。
https://stackoverflow.com/questions/38336209
复制相似问题