用C++将回调函数转换为DWORD_PTR
Convert Callback Function to DWORD_PTR in C++
实际上是c++的新手。我写了这个代码,但说无法从"waveOutProc"转换为"DWORD_PTR"。你能告诉我如何修复它吗?
感谢
void CALLBACK Audio::waveOutProc(HWAVEOUT hWaveOut, unsigned int uMsg,
unsigned long dwInstance, unsigned long dwParam1,
unsigned long dwParam2)
{
/*
* pointer to free block counter
*/
int* freeBlockCounter = (int*)dwInstance;
/*
* ignore calls that occur due to openining and closing the
* device.
*/
if(uMsg != WOM_DONE) { return ; }
EnterCriticalSection(&waveCriticalSection) ;
(*freeBlockCounter)++ ;
LeaveCriticalSection(&waveCriticalSection) ;
}
//////////////////////////////////////////////////////////////////////////////////
void Audio::playSound(const char* filename)
{
HWAVEOUT hWaveOut ;
HANDLE hFile;
WAVEFORMATEX wfx ;
char buffer[1024];
int i;
...
if(waveOutOpen(
&hWaveOut,
WAVE_MAPPER,
&wfx,
(DWORD_PTR)waveOutProc, ///////////Error Point
(DWORD_PTR)&waveFreeBlockCount,
CALLBACK_FUNCTION
) != MMSYSERR_NOERROR) {
fprintf(stderr, "unable to open wave mapper devicen");
ExitProcess(1);
}
...
}
此外,除非处理隐式this
参数,否则不能在C/C++中将成员函数作为回调传递。
您的目标回调具有以下签名
void CALLBACK waveOutProc(
HWAVEOUT hwo,
UINT uMsg,
DWORD_PTR dwInstance,
DWORD_PTR dwParam1,
DWORD_PTR dwParam2
);
而Audio::waveOutProc可能是一个成员函数,它隐含着这个论点。
void CALLBACK waveOutProc(Audio*,
HWAVEOUT hwo,
UINT uMsg,
DWORD_PTR dwInstance,
DWORD_PTR dwParam1,
DWORD_PTR dwParam2
);
只需将waveOutProc
定义为静态函数或自由函数即可。
waveOutProc是一个函数,因此不能将其强制转换为积分类型(值)。此外,我想waveOutProc可能也不是你班的静态成员?只能将静态函数作为回调函数传递。
您在评论中发布的错误表明waveOutProc
是Audio
类的成员函数,C++不允许您将成员函数分配给需要"正常"函数的参数或变量。这是因为成员函数有一个名为this
的隐式参数,它是指向Audio
类实例的指针。
相反,编写一个所谓的静态成员函数(static
关键字表示没有隐含的this
参数)是一种很好的做法,它封装了要调用的成员函数。这是可能的,因为waveOutOpen
将用户数据变量作为它的第五个参数,然后将其传递给静态回调。静态成员函数包装器比只使回调为静态要好,因为这样您就可以访问所有类成员变量(而不是仅访问一个变量,例如freeBlockCounter
)。您的静态成员函数包装器可能如下所示:
class Audio {
private:
int freeBlockCounter;
public:
....
static void CALLBACK waveOutProcWrapper(HWAVEOUT hWaveOut, unsigned int uMsg,
unsigned long dwInstance,
unsigned long dwParam1,
unsigned long dwParam2);
void waveOutProc(HWAVEOUT hWaveOut, unsigned int uMsg, unsigned long dwParam1,
unsigned long dwParam2);
};
以及wrapperProc:的实现
void CALLBACK Audio::waveOutProcWrapper(HWAVEOUT hWaveOut, unsigned int uMsg,
unsigned long dwInstance,
unsigned long dwParam1,
unsigned long dwParam2) {
((Audio*)dwInstance)->waveOutProc(hWaveOut, uMsg, dwParam1, dwParam2);
}
请注意dwInstance
参数是如何"转换"为隐式this
参数的。您现在可以通过以下方式提供waveOutProcWrapper
到waveOutOpen
int:
if(waveOutOpen(
&hWaveOut,
WAVE_MAPPER,
&wfx,
(DWORD_PTR)waveOutProcWrapper, ///////////Error Point
(DWORD_PTR)this,
CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
fprintf(stderr, "unable to open wave mapper devicen");
ExitProcess(1);
}
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 以十六进制打印出 DWORD 会在 win32 c++ 中返回0x7FFFFFFF
- 非法,左操作数具有类型 'DWORD [29]'
- 编译时出错 - 从 DWORD 到 LPCVOID 的转换
- 如何在 c++ 中将 DWORD 转换为 PVOID?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- C++添加 2 个 DWORD 的算术溢出
- 此指令中的错误 C2415 "MOV Incoming_Packet_Length,DWORD PTR SS:[EBP-14]"
- MOV EAX, DWORD PTR SS:[EBP+8h] 的含义是什么,我怎样才能把它翻译成 AT&T 格式?