2014-10-10 139 views
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; 

所以我的回調定義是錯誤的!

回答

2

在參數的聲明本

void (CALLBACK * LINECALLBACK)(
    DWORD    hDevice, 
    DWORD    dwMessage, 
    DWORD_PTR   dwInstance, 
    DWORD_PTR   dwParam1, 
    DWORD_PTR   dwParam2, 
    DWORD_PTR   dwParam3 
); 

而言是不一樣的,因爲這:

void CALLBACK my_callback(
    DWORD dwDevice, 
    DWORD nMsg, 
    DWORD dwCallbackInstance, 
    DWORD dwParam1, 
    DWORD dwParam2, 
    DWORD dwParam3 
): 

參數3至圖6是在第二的第一decarations和整數指針。

由於omn 32bit Windows DWORD s具有與可能編譯的指針相同的大小。

在64位Windows上,指針的大小與DWORD不同。

+0

確實,但DWORD和DWORD_PTR都是無符號長整型,所以它們應該是等價的。剛剛嘗試過,並修復! – 2014-10-10 11:25:07

+2

也許,也許不是。顯然它不是這種情況。你確定DWORD_PTR沒有被typedefed爲DWORD *嗎?如果是這種情況,它將是一個64位的類型,而DWORD可能是一個32位的類型。 – Clearer 2014-10-10 11:27:34

+1

Ahhh intellisence給了我錯誤的信息 - typedef for DWORD_PTR實際上是:typedef ULONG_PTR DWORD_PTR,* PDWORD_PTR;這就解釋了。謝謝。 – 2014-10-10 11:29:26