0
我在使用Visual Studio 2008 Professional構建。當我使用Win32編譯時,它編譯得很好。將回調函數從32位移植到64位
但是當我切換到64位,然後我得到這個編譯錯誤:
error C2664: 'lineInitializeExA' : cannot convert parameter 3 from 'void (__cdecl *)(DWORD,DWORD,DWORD,DWORD,DWORD,DWORD)' to 'LINECALLBACK'
None of the functions with this name in scope match the target type
一些定義/的typedef ::
typedef unsigned long DWORD;
#define CALLBACK __stdcall
在tapi.h
而且LINECALLBACK的定義是這樣的:
typedef void (CALLBACK * LINECALLBACK)(
DWORD hDevice,
DWORD dwMessage,
DWORD_PTR dwInstance,
DWORD_PTR dwParam1,
DWORD_PTR dwParam2,
DWORD_PTR dwParam3
);
在Windows上無符號長整型在32和64位平臺上是32位寬。所以肯定這不是問題。
任何想法爲什麼?以及如何解決?
這是代碼。
#include <tapi.h> // Windows tapi API
#include <stdio.h>
/*
I know it says tapi32.lib but I believe that is just old naming -
don't think 32 bit specific. and in any case don't get to linking phase
*/
#pragma comment(lib,"tapi32.lib")
void CALLBACK my_callback(DWORD dwDevice,
DWORD nMsg,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3) {
printf("my_callback called\n");
}
int main() {
LONG result = -1;
DWORD dwAPIInit = 0x00020002;
HLINEAPP happ; // application handle
DWORD numlines; // Number of line devices in system.
result = lineInitializeEx (&happ, GetModuleHandle(0),
my_callback, "TAPITEST", &numlines, &dwAPIInit, 0);
return 0;
}
****編輯。不知道爲什麼,但我所看到的DWORD_PTR爲:
typedef unsigned long DWORD_PTR;
但在檢查時使用:
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
所以我的回調定義是錯誤的!
確實,但DWORD和DWORD_PTR都是無符號長整型,所以它們應該是等價的。剛剛嘗試過,並修復! – 2014-10-10 11:25:07
也許,也許不是。顯然它不是這種情況。你確定DWORD_PTR沒有被typedefed爲DWORD *嗎?如果是這種情況,它將是一個64位的類型,而DWORD可能是一個32位的類型。 – Clearer 2014-10-10 11:27:34
Ahhh intellisence給了我錯誤的信息 - typedef for DWORD_PTR實際上是:typedef ULONG_PTR DWORD_PTR,* PDWORD_PTR;這就解釋了。謝謝。 – 2014-10-10 11:29:26