将回调函数从32位移植到64位

时间:2014-10-10 11:10:18

标签: c windows 64-bit tapi

我正在使用Visual Studio 2008 Professional构建。当我使用Win32 build进行编译时,它编译得很好。

但是当我切换到x64时,我得到了这个编译错误:

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

一些定义/ typedefs ::

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;

所以我的回调定义错了!

1 个答案:

答案 0 :(得分:2)

根据论据&#39;声明这个

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是第1个decarations中的指针和第2个中的整数。

因为omn 32bit Windows DWORD具有与指针相同的大小,这可能会编译。

在64位-Windows上,但指针的大小与DWORD s不同。