RPC调用返回增量值而不是ULONG_PTR

时间:2014-05-15 01:09:19

标签: c++ c types rpc primitive

我对RPC代码比较陌生,所以如果这很简单,我很抱歉。

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

我的问题是,当我这样做时,而不是将一个无符号的__int64值放在我传递给RPC函数的指针所引用的位置,而是从0开始得到一个数字,如果我们只是增加随后调用RPC函数。

如果我取消了对WINAPI函数的调用,我可以毫无问题地传递和设置ULONG_PTR / unsigned __int64值,所以我不知道为什么我最终会在客户端增加一个数字。

客户端代码

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);

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

enter image description here

有没有理由我似乎无法获得实际的ULONG_PTR值?为什么指针值增加1?我知道这个句柄对客户端没有任何意义,但我打算在以后的服务器调用中使用它。

更新1 我更新了服务器端代码,看看我是否可以获得明确设置的任何值。经过一些游戏,并且有一种唠叨的感觉,“无符号__int64”的“64”部分与它有关,我终于发现,如果我传回4294967295,最大的无符号32位值,或任何小于此值,功能正常。但是,返回4294967296会返回0,而..97会返回1,等等。

所以看起来我的RPC代码处理64位值时出现问题。

1 个答案:

答案 0 :(得分:0)

所以看起来问题有点像我原来看的那样。

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

将我的ULONG_PTR的接口typedef更改为__int64就可以了。