كيفية تمرير طريقة COM كحجة وظيفة؟ ومايكروسوفت مترجم خطأ C3867

StackOverflow https://stackoverflow.com/questions/423730

  •  05-07-2019
  •  | 
  •  

سؤال

وأود أن تمرير أسلوب COM كحجة وظيفة ولكن أحصل على هذا الخطأ (مايكروسوفت (R) 32 بت C / C ++ الأمثل مترجم النسخة 15.00.30729.01 ل80x86):

والخطأ C3867: 'IDispatch و:: GetTypeInfoCount': استدعاء وظيفة مفقودة قائمة وسيطة. استخدام "وIDispatch و:: GetTypeInfoCount 'لإنشاء مؤشر إلى عضو

ما أنا في عداد المفقودين؟

وشكرا جزيلا لكم.

#include <atlbase.h>

void update( HRESULT(*com_uint_getter)(UINT*), UINT& u )
{
   UINT tmp;
   if ( S_OK == com_uint_getter( &tmp ) ) {
      u = tmp;
   }
}

// only for compile purpose, it will not work at runtime
int main(int, char*[])
{
   // I choose IDispatch::GetTypeInfoCount just for the sake of exemplification
   CComPtr< IDispatch > ptr;
   UINT u;
   update( ptr->GetTypeInfoCount, u );
   return 0;
}
هل كانت مفيدة؟

المحلول 3

وكما أشار morechilli خارج هذه مسألة C ++. هنا هو الحل، وذلك بفضل لزميلي دانيال:

#include <atlbase.h>

template < typename interface_t >
void update( interface_t* p, HRESULT (__stdcall interface_t::*com_uint_getter)(UINT*), UINT& u )
{
   UINT tmp;
   if ( S_OK == (p->*com_uint_getter)( &tmp ) ) {
      u = tmp;
   }
}

// only for compile purpose, it will not work at runtime
int main(int, char*[])
{
   // I choose IDispatch::GetTypeInfoCount just for the sake of exemplification
   CComPtr< IDispatch > ptr;
   UINT u;
   update( ptr.p, &IDispatch::GetTypeInfoCount, u );
   return 0;
}

نصائح أخرى

ويبدو وكأنه ج ++ مشكلة على التوالي.

وأسلوب لديك يتوقع مؤشر إلى وظيفة.

لديك وظيفة عضو - (الذي يختلف عن وظيفة)

وعادة ما سوف تحتاج إلى إما:
1. تغيير الدالة التي تريد تمريرها إلى كونها ثابتة.
2. تغيير نوع المؤشر من المتوقع أن مؤشر دالة عضو.

وبناء الجملة من أجل التعامل مع المؤشرات الدالة العضو ليست أفضل ...

وخدعة القياسية سيكون (1) ومن ثم تمرير هذا الكائن مؤشر صراحة كحجة مما يتيح لك ثم استدعاء أعضاء غير ثابت.

وBoost.Function هو أيضا خيارا معقولا هنا (لاحظ أنني لم يختبر ما كتبته أدناه، لذلك قد تتطلب بعض التعديل - وخاصة، وأنا لست متأكدا إذا كان لديك للاتصال نوعا من الحصول على () على طريقة الكائن CComPtr الخاص بك):

#include <atlbase.h>
#include <boost/function.hpp>
#include <boost/bind.hpp>

void update( boost::function<HRESULT (UINT*)> com_uint_getter, UINT& u )
{
   UINT tmp;
   if ( S_OK == com_uint_getter( &tmp ) ) {
      u = tmp;
   }
}

// only for compile purpose, it will not work at runtime
int main(int, char*[])
{
   // I choose IDispatch::GetTypeInfoCount just for the sake of exemplification
   CComPtr< IDispatch > ptr;
   UINT u;
   update( boost::bind(&IDispatch::GetTypeInfoCount, ptr), u );
   return 0;
}

وهذا هو نفس كل الاشياء مؤشر إلى الأعضاء التي morechilli المذكورة، لكنه يخفي بعض من بناء الجملة أكثر فوضوية من استخدامه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top