如何把_RecordsetPtr的地址再次恢复为_RecordsetPtr

natfit 2011-07-08 06:24:57
我有一个结果集指针_RecordsetPtr,怎样把其地址取出来,再在另外一个方法里还原为_RecordsetPtr?

用_RecordsetPtr *test=(_RecordsetPtr *)addr

能生成个RecordsetPtr,但m_pinterface的地址就不对了,数据就没有取到

...全文
108 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bulerain 2011-07-11
  • 打赏
  • 举报
回复
指针指向的堆地址吗?是否在你调用之前就已经释放了。还是指向句柄栈,这样的话 就不正确
一般在32位的windows,地址都是一个DWORD的取值范围内的,可以取地址的值啊
DWORD dwaddr=(DWORD)pvoid;

然后, PYOURSTRUCT ps=(PYOURSTRUCT)dwaddr;

如果dwaddr的地址是否有效的,就可以了
natfit 2011-07-11
  • 打赏
  • 举报
回复
返回的_RecordsetPtr 在dData::getTableDataR中动态生成,应当是指向堆的吧
natfit 2011-07-11
  • 打赏
  • 举报
回复
我测试了一下:(ehouse的值是一直在的,没有失效)

_RecordsetPtr ePHouse=dData::getTableDataR(hfzxEnum::Phouse,sqlArray);

1 LPVOID addr=(LPVOID)ePHouse;
2 LPVOID addr=ePHouse;
3 LPVOID addr=&ePHouse;


4 _RecordsetPtr *old=(_RecordsetPtr *)addr;

5 //_RecordsetPtr old1=(_RecordsetPtr)addr;

6 //_RecordsetPtr *old2=(_RecordsetPtr)addr;

7 //_RecordsetPtr old3=(_RecordsetPtr)addr;

其中语句5、6、7编译出错,只有4成功

语句1和2 效果一样,

>? ePHouse
{0x026b1108}
m_pInterface: 0x026b1108   这个是原始数据位置吧?
>? addr
0x026b1108
>? old
0x026b1108 {0x4dd14cf0}
m_pInterface: 0x4dd14cf0
>? *old
{0x4dd14cf0}
m_pInterface: 0x4dd14cf0

可以看到m_pInterface不一致

语句3地址都不一样
>? addr
0x025ccc3c
>? old
0x025ccc3c {0x00000000}
m_pInterface: 0x00000000
更是出错,而且在3执行后,ePHouse变为0000000




natfit 2011-07-11
  • 打赏
  • 举报
回复
搞定了,不能用LPVOID addr=(LPVOID)ePHouse;

用LPVOID addr=(IUnknown *)ePHouse;

恢复时用
_RecordsetPtr esou=(_RecordsetPtr)(IUnknown *)tw.sAddr;

就可以了

多谢各位!
向立天 2011-07-10
  • 打赏
  • 举报
回复
什么叫“addr能传递出去,也能恢复,但恢复出来的东东和原来的不一样”
说白了addr就是一个数啊
比如1你不管怎么弄只要addr是1就是对的
如果变成别的值了就说明你操作有问题
natfit 2011-07-10
  • 打赏
  • 举报
回复
test不是局部的,我是为了方便说明。

addr能传递出去,也能恢复,但恢复出来的东东和原来的不一样

((_RecordsetPtr)addr)->用这个程序编译通不过,只能用((_RecordsetPtr *)addr
副组长 2011-07-10
  • 打赏
  • 举报
回复
其实用addr=test也一样可以,只是不对
==================================
一个问题是不是楼上所说的局部的addr,出去就没了。
2是强制类型转换的问题,试试((RecordsetPtr)addr)->
副组长 2011-07-10
  • 打赏
  • 举报
回复
你不是有 RecordsetPtr test;
long addr=(LPVIOD)test

test不是指针?

副组长 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 natfit 的回复:]
test不是局部的,我是为了方便说明。

addr能传递出去,也能恢复,但恢复出来的东东和原来的不一样

((_RecordsetPtr)addr)->用这个程序编译通不过,只能用((_RecordsetPtr *)addr
[/Quote]
是RecordsetPtr

够乱的了,_RecordsetPtr是地址的指针?
向立天 2011-07-09
  • 打赏
  • 举报
回复
你这个addr是怎么得到的
如果addr是对的那你的方法是正确的
向立天 2011-07-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 natfit 的回复:]
我在一个方法里用 直接取RecordsetPtr的地址保存为long,再在另外的方法里还原。

大约是这样取的,

RecordsetPtr test;

test 赋值语句

long addr=(LPVIOD)test;

其实用addr=test也一样可以,只是不对


不能用引用,因为是个通用方法,还要把CString、我自己的类等都强制转换。
[/Quote]test是局部的?
这样出了你方法的范围它就被释放了啊
jyh_baoding 2011-07-09
  • 打赏
  • 举报
回复
如果内存的结构正确,应该是可以的
natfit 2011-07-09
  • 打赏
  • 举报
回复
我在一个方法里用 直接取RecordsetPtr的地址保存为long,再在另外的方法里还原。

大约是这样取的,

RecordsetPtr test;

test 赋值语句

long addr=(LPVIOD)test;

其实用addr=test也一样可以,只是不对


不能用引用,因为是个通用方法,还要把CString、我自己的类等都强制转换。
fishion 2011-07-09
  • 打赏
  • 举报
回复
如果你用的是不是跨线程的函数的话,那你就可以直接用类似void func(_RecordsetPtr *test)这样呀
如果是跨线程的,这是com吧,最好不要跨线程
nightkids_008 2011-07-08
  • 打赏
  • 举报
回复
用引用。。。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧