标题:关于SendMessage获取ListBox内容的问题
只看楼主
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 
以下是引用你们都要疼我哦在2010-7-22 20:57:52的发言:

用内存映射共享啊。CreateFileMapping创建用于共享的内存映射文件对象hFile记得为-1 ---OpenFileMapping打开---MapViewOfFile映射一个视图 得到共享区域指针。。。。。。使用。。。。解除映射。。。关闭。。。步骤不可少。

楼上有高手讲了,这个最好是写成DLL,然后目标进程LoadLibrary注入,这样是比较流行的。
另外弱弱的问一下,楼主这个:=是C啊。。。怎么好象以前瞄过的PASCAL
这个我肯定是用了的。

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-07-22 21:34
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:0 
我是看你好象映射的是文件 而不是共享空间?
映射文件没用吧,不能跨进程。
用于进程共享应该是用hFile为-1创建共享空间。
得到共享区域指针。
取得所需列表信息,送到共享空间, 其他进程不断的循环读取共享空间数据。

不过既然你自己可以取到信息,那好象就没必要用映射了吧,看来使用这个的方法是不行的。
你的意思似乎是想把自己的变量放到共享区域,避免重定位问题?貌似不行哇。

还是用比较流行的DLL注入吧。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-07-22 22:32
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 
-1?
反正我在pascal里是写成这样的$FFFFFFFF
hFile 是调用FileOpen()或FileCreate()函数后返回的文件句柄。如果不是共享文件,而是共享内存区域,需要在这里设为$FFFFFFFF。
根据上面的资料写的。不知道对否。

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-07-22 22:39
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:0 
其实偶是一直没明白楼主是想干嘛?码也看的头晕,今天气压低,湿度太大了,烦恼。
偶也不知道共享区域是不是可以当成个结构去读写?哎,期待高手出现。
看来必须要努力学习一门高级语言啊。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-07-22 22:42
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 
回复 34楼 你们都要疼我哦
其实我就是想把一个外部进程的ListBox的实例映射到本进程的一个ListBox中。
如果在进程内我可以使用一个FindControl函数查找到一个控制的实例,其原型如下:
function FindControl(Handle: hwnd): TWinControl;
procedure TForm1.Button2Click(Sender: TObject);
var
   t:TMemo;//定义一个富文本框控件
begin
      t:=TMemo(findcontrol(Memo1.Handle));//把FindControl函数返回的控件强制转换为富文本框控件
      ShowMessage(t.Text);//然后这就样就可以读取其数据了。
end;   
我想就是想把一个外部进程的控件这样使用。

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-07-22 22:49
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:0 
最常见的就是DLL注入了。
或者直接HOOK API。
或者用VirtualAllocEx CreateRemoteThread 写远程线程。

内存映射可以创建共享的区域,但是偶一直觉得似乎它是独立的一块,不能
把它分给某进程用,然后另一进程可以随时去读它的数据吧。可能你是想这样用的?

记得好象DLL也可以用做共享数据,限制似乎少点 在里面定义个共享的结构什么的应该
没问题,不过具体没用过。

所以还是DLL注入 或者HOOK吧。

偶也等高人出现

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-07-22 23:45
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 
DLL注入系统的资料比较少,我在网上找了些看得模里模糊的。总是有一种空中楼阁的感觉。

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-07-23 09:07
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
得分:0 
用内存映射共享‘数据’还行,共享代码是不可能的。
一个VCL对象生成,并不是仅仅AllocMem一块内存就行啊。举例说:对象本身的方法(虚函数)其实是函数指针。真正的函数代码,并没有随对象分配空间
而自动被拷贝到你分配的内存映像区。退一步说,即使你的对象所有元素都放置进去了,那这个对象的方法究竟被谁调用呐?目标进程并不会主动来调用他。

所以你要注入简单代码的话,可以直接注入(限制是delphi的runtime库就不能用了,而且代码重定位是一件很麻烦的事)。复杂的,比如你上面说的把一个VCL对象放入到目标进程中,就要用注入DLL的方法,这种方法没有什莫限制,自由度比较高。

注入方法比较常用的就两种:用windows消息钩子和注入少量代码然后用此代码加载dll。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-23 09:28
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
得分:0 
刚用Delphi做了一下‘代码注入’测试。顺利获得。


举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-23 10:18
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 
回复 39楼 东海一鱼
能否把工程传上来给我学习下?

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-07-23 10:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-313255-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.396754 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved