调用成员函数指针失败

调用成员函数指针失败,求救

//类定义
class CDimChange
{
public:
CDimChange(void);
~CDimChange(void);
public:
void InitializeDialog();
public:
void SelFilterMenuAction(char* dialog, char* component, ProAppData appdata);
}
//void InitializeDialog()函数
void(CDimChange::*pSelFilterMenuAction)(char*, char*, ProAppData)=&CDimChange::SelFilterMenuAction;
void CDimChange::InitializeDialog()
{
ProError err;
//调用方式一
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
(ProUIAction)pSelFilterMenuAction,&ChgData);
//调用方式二
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
(ProUIAction)SelFilterMenuAction,&ChgData);
//或
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
(ProUIAction)CDimChange::SelFilterMenuAction,&ChgData);
//调用方式三
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
CDimChange::SelFilterMenuAction,&ChgData);
}
//ProUIAction定义,不能修改
typedef void (*ProUIAction)(
char* dialog,
char *component,
ProAppData appdata);
//函数原型
extern ProError ProUIOptionmenuSelectActionSet(
    char* dialog,
    char* optionmenu,
    ProUIAction action,
    ProAppData  appdata);


VS2008在编译时报错,这个问题困扰我好久了,请大家帮忙:
方式一错误信息
 error C2440: 'type cast' : cannot convert from 'void (__cdecl CDimChange::* )(char *,char *,ProAppData)' to 'ProUIAction'
1>        There is no context in which this conversion is possible
方式二:
error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'ProUIAction'
1>        None of the functions with this name in scope match the target type
方式三:
error C3867: 'CDimChange::SelFilterMenuAction': function call missing argument list; use '&CDimChange::SelFilterMenuAction' to create a pointer to member
------解决思路----------------------
方法1:  声明类成员函数为静态, 并传入实例指针

public:    
    static  void SelFilterMenuAction(char* dialog, char* component, ProAppData appdata, CDimChange* instance )
                        {
                             instance ->a = 10;    // 如此使用类成员
              // .... 
                        }

     // 这里同样修改
     typedef void (*ProUIAction)(     char* dialog,     char *component,     ProAppData appdata, CDimChange* instance ); 


方法2: 声明类成员函数为静态, 并声明使用到的成员为静态

public:    
    static int a;    //  声明使用到的成员为静态
    static  void SelFilterMenuAction(char* dialog, char* component, ProAppData appdata)
                        {
                          CDimChange::a = 10;    // 如此使用类成员
              // .... 
                        }
 


方法3: 声明类成员函数为静态, 声明类实例为全局静态

class CDimChange;
CDimChange* g_CDC;
class CDimChange
{
    //.....
    static  void SelFilterMenuAction(char* dialog, char* component, ProAppData appdata)
                        {
                          g_CDC->a = 10;    // 如此使用类成员
              // .... 
                        }
}
 


方法4: 使用uion强制转换, 但在调用时要保证传入ecx 为实例指针

//ProUIAction定义,不能修改
typedef void (*ProUIAction)(
char* dialog,
char *component,
ProAppData appdata);
void(CDimChange::*pSelFilterMenuAction)(char*, char*, ProAppData)=&CDimChange::SelFilterMenuAction;
void CDimChange::InitializeDialog()
{
         union
       {
            void(CDimChange::* a)(char*, char*, ProAppData);
            ProUIAction b;
       ];
      a = pSelFilterMenuAction;        //  使用uion强制转换
ProError err;
//调用方式一
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
b,&ChgData);

}
extern ProError ProUIOptionmenuSelectActionSet(
    char* dialog,
    char* optionmenu,
    ProUIAction action,
    ProAppData  appdata)
{
CDimChange* a;
__asm{                  // 传入ecx 为实例指针
push 其它参数
mov ecx, a;
call action;
};
}