2017-04-13 12 views
0

私は、コールバックCALLBACKマクロ(QT)

int sampleCallbackFunction(struct SampleStruct sample); 
としての私のメンバ関数を渡したい pDLLSetSample

typedef int (CALLBACK * pDLLSetSample) (struct SampleStruct rawDataSample); 

あるこの

int iV_SetSampleCallback(pDLLSetSample pSampleCallbackFunction) 

のようなシグネチャを持つ機能を持っています

と私がそれを好きと呼ぶとき

iV_SetSampleCallback(&MainWindow::sampleCallbackFunction); 

私はエラー

error: C2664: 'int iV_SetSampleCallback(pDLLSetSample)': cannot convert argument 1 from 'int (__thiscall MainWindow::*)(SampleStruct)' to 'pDLLSetSample' 

を持って、それがなぜ起こるか私には理解できません。 CALLBACKマクロは何ですか? __thiscallはどこから来たのですか?コールバックをこの関数に正しく渡すにはどうすればよいですか?

+2

SensoMotoricを呼び出して、コールバックAPIが壊れていることを通知します。呼び出された関数に 'void * 'を渡すことを許さないコールバックAPIは、設計上、壊れています。 'pDLLSetSample'は' typedef int(CALLBACK * pDLLSetSample)(構造体SampleStruct rawDataSample、void * userData) 'および' int iV_SetSampleCallback(pDLLSetSample pSampleCallbackFunction、void * userData) 'として宣言する必要があります。... –

答えて

2

通常の関数へのポインタではなく、静的でないクラスメンバ関数sampleCallbackFunctionへのポインタを渡そうとしているため、エラーが発生しています。非静的なクラスメンバ関数は明示的にthisパラメータを持つことに注意してください。 CALLBACKマクロはWindowsでよく使用され、通常は呼び出し規約のstdcallの略です。それは呼び出し規約予想(またはに拡大するものは何でもCALLBACK)きますので

  • 宣言メンバーコールバック関数にメンバ関数への静的
  • プリペンドCALLBACKマクロをあなたが必要とするこのエラーを修正するには

static int CALLBACK sampleCallbackFunction(struct SampleStruct sample); 
+0

があります。 'this'関数へのポインタ? – user1496491

+1

通常、APIは後でコールバックに渡される不透明なポインタのようなパラメータを渡す方法を提供します。しかし、あなたのケースでは何らかの理由でそのようなパラメータがないので、コールバックをインストールする前に、このポインタをいくつかのグローバル変数に格納する唯一の選択肢があります。 – VTT

+0

大丈夫、ありがとう! – user1496491

関連する問題