| 
					阅读:3326回复: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 你把要比较的变量的地址传进去就好了,强制转换一下类型 好像给过一次分就不能再给了,抱歉啊 | |
| 
 | 
上一页
下一页
 
			
			
						
			
			
						
			
		 
							
 
				 
				