Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ RPC调用返回递增的值,而不是ULONG_PTR_C++_C_Types_Rpc_Primitive - Fatal编程技术网

C++ RPC调用返回递增的值,而不是ULONG_PTR

C++ RPC调用返回递增的值,而不是ULONG_PTR,c++,c,types,rpc,primitive,C++,C,Types,Rpc,Primitive,我对RPC代码比较陌生,所以如果这是一件小事,我深表歉意 我正在编写一个RPC函数,它在服务器端调用WinSCard中的WINAPI函数。函数通过引用返回一个LPSCARDCONTEXT句柄,该句柄最终只是一个ULONG_PTR,它是一个无符号的uu int64指针。理想情况下,服务器RPC调用应该将这个句柄值交回进行调用的客户端 我的问题是,当我这样做时,我没有得到一个无符号的_int64值,它放在我传递给RPC函数的指针所引用的位置,而是得到一个以0开头的单个数字,如果我们随后调用RPC函数

我对RPC代码比较陌生,所以如果这是一件小事,我深表歉意

我正在编写一个RPC函数,它在服务器端调用WinSCard中的WINAPI函数。函数通过引用返回一个LPSCARDCONTEXT句柄,该句柄最终只是一个ULONG_PTR,它是一个无符号的uu int64指针。理想情况下,服务器RPC调用应该将这个句柄值交回进行调用的客户端

我的问题是,当我这样做时,我没有得到一个无符号的_int64值,它放在我传递给RPC函数的指针所引用的位置,而是得到一个以0开头的单个数字,如果我们随后调用RPC函数,它只会增加

如果我消除了对WINAPI函数的调用,我就可以毫无问题地传递和设置ULONG_PTR/unsigned__int64值,因此我不知道为什么会在客户端使用递增的数字

客户端代码

接口定义

如果在返回之前调试此函数并遍历服务器端调用,则LPSCARDCONTEXT contH和参数指针b的值是相同的。但在本例中,返回后,它不是指向14771806…185值的客户端上的cpr,而是指向一个ULONG_PTR,在我第一次调用它时,它的值为0。如果我重新运行客户端代码,CPR的值会随着每次连续调用而增加1,直到我重新启动RPC服务器

有什么原因我不能得到实际的ULONG_PTR值吗?为什么指针值会增加1?我知道这个句柄对客户端没有任何意义,但我打算在以后对服务器的调用中使用它

更新1 我更新了服务器端代码,以查看是否可以恢复显式设置的任何值。在玩了一番之后,我觉得unsigned__int64的64部分与此有关,我最终发现,如果我传回4294967295,最大的无符号32位值,或小于此值的任何值,函数工作正常。然而,发送4294967296返回0,..97返回1,以此类推


因此,我的RPC代码在处理64位值时似乎出现了问题。

因此,问题似乎超出了我最初看到的范围

在IDL定义文件中,由于IDL仅支持基本类型,我被迫声明自己的typedef。当我定义ULONG_PTR时,我将它键入了一个_int3264,它将根据系统在32位或64位之间变化。虽然我测试的两个系统都是64位的,但在通过线路发送之前,int3264被截断为32位


将ULONG_PTR的接口typedef更改为_int64就成功了。

为了缩小ScardestStablishContext和RPC机制之间的原因,可以尝试将TC_LongRetVal函数更改为*b=0x112233445667788ull;返回0;并查看该值是否正确返回到客户端。@AndrewMedico,谢谢您的评论。我确实试过了,它正确地返回了显式设置的值。似乎没有什么意义的是调用scardesttablishcontext返回良好,并正确设置句柄,这似乎是它不喜欢的LPSCARDCONTEXT返回。
ULONG_PTR myuptr = 0;
ULONG_PTR* cpr = &myuptr;
TC_LongRetVal(cpr);
cout << "My ULONG_PTR's value is: " << *cpr << "\n";
int TC_LongRetVal(ULONG_PTR* b){
    LPSCARDCONTEXT contH = b;
    SCardEstablishContext(2, NULL, NULL, contH);
    return 0 ;
}
int TC_LongRetVal([in, out] ULONG_PTR* b);