如何在MSVC中获取成员函数指针?

时间:2016-07-12 18:15:31

标签: c++ excel winapi visual-c++

我不打算深入了解Excel方面的细节,我基本上从这个例子中获取代码:

C++ app automates Excel (CppAutomateExcel)
solution1.cpp

所以我在MSVC中尝试了这段代码并编译:

class foo { public: virtual void bar(){} };

int main()
{
    void (foo::*p)() = &foo::bar;
}

但是在Excel中捕获移动函数地址的类似代码不起作用:

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:'&amp;':对绑定成员函数表达式的非法操作

如果我删除&,则说我应该将其添加回来:

  

错误C3867:'Excel :: _ Worksheet :: Move':非标准语法;使用'&amp;'创建指向成员的指针

任何有关如何做的帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

你在问题​​中说“但代码类似......”然后你会显示你不做同样事情的代码。尝试使用与您在较小示例中设置pMove时使用的p相同的语法。尝试&Excel::_Worksheet::Move;之类的内容(不使用“spXlSheet-&gt;”)。

如果你可以指定在你设置函数指针时调用函数指针的对象的特定实例,我不知道这样的能力。从设置变量的地方删除spXlSheet->后,请使用它来代替调用函数指针。

答案 1 :(得分:1)

你需要像这样声明方法指针:

// or whatever parameter type Move() actually uses...
void (Excel::_Worksheet::*pMove)(tagVARIANT, tagVARIANT) = &Excel::_Worksheet::Move;

然后,要实际调用pMove(),您必须执行以下操作:

Excel::_WorksheetPtr spXlSheet = ...;
(spXlSheet.Get()->*pMove)(...);