阅读:3121回复:21
关于InterlockedCompareExchange
我在应用程序中调用InterlockedCompareExchange,第一个参数我用的是LONG*,但是编译的时候说这是个错误,说应该用void**。
我查了msdn,sdk部分说要用LPLONG(我认为就是PLONG),但是ddk部分说要用PVOID *;我又查了ddk2000,里面又说要用PLONG,!? 到底哪个说法是对的?? 我没装sdk,只有vc6+msdn(非.net版)+ddk2000 |
|
|
沙发#
发布于:2004-01-16 13:38
你把要比较的变量的地址传进去就好了,强制转换一下类型
:D |
|
板凳#
发布于:2004-01-16 14:25
你把要比较的变量的地址传进去就好了,强制转换一下类型 传了好像也不行 :( 说第三个参数不是pvoid类型,sdk里这个参数就是LONG,而nt4 ddk里的倒是pvoid 我怀疑他调用的是ddk里的函数,而不是sdk里的,把sdk装上再试试 [编辑 - 1/16/04 by AthlonXP] |
|
|
地板#
发布于:2004-01-16 14:30
麻烦大了,机子上的sdk以前删了,55555
谁有sdk的下载地址,江湖救急啊!! |
|
|
地下室#
发布于:2004-01-16 14:50
不会呀,下面的Lock是个LONG,好好的呀。
你是不是用错h文件了? InterlockedCompareExchange(&gData.Lock, 1, 0); |
|
5楼#
发布于:2004-01-16 14:55
不会呀,下面的Lock是个LONG,好好的呀。 我想也是,那要加哪个头文件?windows.h? |
|
|
6楼#
发布于:2004-01-16 15:05
下面的ftn、tn都是LONG,结果error
InterlockedCompareExchange(&ftn, 0, tn) 输出信息 C:\\Temp\\AnCard\\Test\\Test3\\Test3Dlg.cpp(282) : error C2664: \'InterlockedCompareExchange\' : cannot convert parameter 1 from \'long *\' to \'void ** \' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast |
|
|
7楼#
发布于:2004-01-16 15:06
用SDK还是MFC的?
winbase.h,在windows.h包括了 你是不是装DDK,然后用了的DDK的声明,但是刚刚好因为一些宏的设置,结果用不正确的? 管它呢,编译器要什么类型你就强制转换成什么类型的,呵呵。 |
|
8楼#
发布于:2004-01-16 15:11
我发现是我用的DDK的声明 :P :P丢大了
winbase.h的是 WINBASEAPI PVOID WINAPI InterlockedCompareExchange ( PVOID *Destination, PVOID Exchange, PVOID Comperand ); |
|
9楼#
发布于:2004-01-16 15:13
winbase.h应该是mfc的,在VC98/Include里面
我看了一下他的声明,结果都是PVOID的,郁闷 WINBASEAPI PVOID WINAPI InterlockedCompareExchange ( PVOID *Destination, PVOID Exchange, PVOID Comperand ); |
|
|
10楼#
发布于:2004-01-16 15:15
强制转换 :D
InterlockedCompareExchange((PVOID*)&ftn, (PVOID)0, (PVOID)tn) ; |
|
11楼#
发布于:2004-01-16 15:16
我发现是我用的DDK的声明 :P :P丢大了 和我的一样,那你装了sdk吗? |
|
|
12楼#
发布于:2004-01-16 15:18
强制转换 :D 借用星爷一句话,这也可以?这么多PVOID看的眼晕 :D |
|
|
13楼#
发布于:2004-01-16 15:21
不会呀,下面的Lock是个LONG,好好的呀。 我驱动里也用这个,用的好好的 :( |
|
|
14楼#
发布于:2004-01-16 15:24
没有装SDK。我那个工程刚好要用DDK的一些h文件,就把DDK的inc路径添加了,结果就用的DDK的声明,巧合。要不是今天我还真没有注意winbase居然是这样声明的:D
这样肯定可以的 ;) |
|
15楼#
发布于:2004-01-16 15:30
没有装SDK。我那个工程刚好要用DDK的一些h文件,就把DDK的inc路径添加了,结果就用的DDK的声明,巧合。要不是今天我还真没有注意winbase居然是这样声明的:D 这样也可以??? 好,试试!!! |
|
|
16楼#
发布于:2004-01-16 15:41
好像不行,要引用其他一打ddk里的头文件 :(
|
|
|
17楼#
发布于:2004-01-16 15:44
2000ddk里\\NTDDK\\inc目录下的winbase.h文件这样声明的:
#if defined(_M_AXP64) || defined(__INITIAL_POINTER_SIZE) #define InterlockedCompareExchange _InterlockedCompareExchange #define InterlockedExchangePointer _InterlockedExchangePointer #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer LONG InterlockedCompareExchange ( IN OUT PLONG Destination, IN LONG ExChange, IN LONG Comperand ); PVOID InterlockedExchangePointer ( IN OUT PVOID *Target, IN PVOID Value ); PVOID InterlockedCompareExchangePointer ( IN OUT PVOID *Destination, IN PVOID ExChange, IN PVOID Comperand ); #pragma intrinsic(_InterlockedCompareExchange) #pragma intrinsic(_InterlockedExchangePointer) #pragma intrinsic(_InterlockedCompareExchangePointer) #else #define InterlockedExchangePointer(Target, Value) \\ (PVOID)InterlockedExchange((PLONG)(Target), (LONG)(Value)) #define InterlockedCompareExchange(Destination, ExChange, Comperand) \\ (LONG)_InterlockedCompareExchange((PVOID *)(Destination), (PVOID)(ExChange), (PVOID)(Comperand)) #define InterlockedCompareExchangePointer(Destination, ExChange, Comperand) \\ _InterlockedCompareExchange(Destination, ExChange, Comperand) 看来x86下的机子必须得用pvoid了,不过msdn里为什么说可以呢?搞不懂 :( |
|
|
18楼#
发布于:2004-01-16 15:52
核心编程里也声明如下:
PVOID InterlockedCompareExchange(PLONG plDestination,LONG Exchange,LONG Comparand); 看来是得装个sdk了 刚下了个.netsdk,不知道有用没有 |
|
|
19楼#
发布于:2004-01-16 16:00
你把要比较的变量的地址传进去就好了,强制转换一下类型 好像给过一次分就不能再给了,抱歉啊 |
|
|
上一页
下一页