递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 4349|回复: 10
打印 上一主题 下一主题

[视窗] 调用静态方法碰到结构体好像会出问题,这种是用法不对吗

[复制链接]

6

主题

152

帖子

1464

积分

金牌会员

Rank: 6Rank: 6

积分
1464
跳转到指定楼层
楼主
发表于 2023-8-3 14:41:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 uuyyhhjj 于 2023-8-3 14:45 编辑
  1.         HRESULT ( STDMETHODCALLTYPE *GetImage )(
  2.             __RPC__in IShellItemImageFactory * This,
  3.             /* [in] */ SIZE size,
  4.             /* [in] */ SIIGBF flags,
  5.             /* [out] */ __RPC__deref_out_opt HBITMAP *phbm);
复制代码
其实就是用指针调用这个IShellItemImageFactory::GetImage,之前用表格方式的调用静态方法可以正常调用那些固定尺寸的参数的只要用变整数都能正常用,现在碰到一个结构体是size,且flags固定4字节的,就出现奇怪的问题了,研究好几天了还是不行,我现在能确定的就是这个size参数传递出问题了,因为默认都用变整数去调用切换32位64位还会导致奔溃,且size的XY值传过去也是没作用的,用嵌入式测试了却没有问题

https://smms.app/image/hGmifaUkXgbuJ4c

就是这里,我希望用表格方式调用,但不知道要怎么传递size,这里偷懒其他地方用嵌入式代码了


下面图片的代码是没问题的,正确调用的话可以拖动滑块条后点按钮,图片大小会变

https://smms.app/image/jsqG7CoOIYBLTKV

图片网址居然还被屏蔽了,只能上链接了
不知道为什么论坛几KB的图片也说文件太大了不给传放站外了,下面是完整代码,需要改一下图片路径才能测试
https://www.123pan.com/s/ZEr5Vv-zTth3.html

回复

使用道具 举报

444

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
40420
沙发
发表于 2023-8-3 16:59:26 | 只看该作者
……这种好像只能嵌入?不知道有没有别的大佬会。
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

25

主题

497

帖子

1808

积分

金牌会员

Rank: 6Rank: 6

积分
1808
板凳
发表于 2023-8-3 21:50:52 | 只看该作者
说白了还是因为火山本身就没有结构,火山的结构是类内部创建一个结构引用并操作
回复

使用道具 举报

6

主题

152

帖子

1464

积分

金牌会员

Rank: 6Rank: 6

积分
1464
地板
 楼主| 发表于 2023-8-3 23:14:45 | 只看该作者
创世魂 发表于 2023-8-3 16:59
……这种好像只能嵌入?不知道有没有别的大佬会。
  1. hr = pImageFactory->GetImage(size, 8, &hBitmap);
  2. 00007FF695DF1C80  mov         rax,qword ptr [rbp+0A8h]  
  3. 00007FF695DF1C87  mov         rax,qword ptr [rax]  
  4. 00007FF695DF1C8A  lea         r9,[rbp+0C8h]  
  5. 00007FF695DF1C91  mov         r8d,8  
  6. 00007FF695DF1C97  mov         rdx,qword ptr [rbp+0E8h]  
  7. 00007FF695DF1C9E  mov         rcx,qword ptr [rbp+0A8h]  
  8. 00007FF695DF1CA5  call        qword ptr [rax+18h]  
  9. 00007FF695DF1CA8  mov         dword ptr [hr],eax  
复制代码


用VS试了下反汇编出来的size用的是lea,是不是我传过去的永远都是指针的值,所以每次重新运行图片尺寸才改变,汇编这块完全不懂,lea的话火山现在是不是完全无解?
回复

使用道具 举报

6

主题

152

帖子

1464

积分

金牌会员

Rank: 6Rank: 6

积分
1464
5#
 楼主| 发表于 2023-8-3 23:18:19 | 只看该作者
qaz2428119 发表于 2023-8-3 21:50
说白了还是因为火山本身就没有结构,火山的结构是类内部创建一个结构引用并操作 ...

我现在想全翻译成表格形式的,一开始调用的参数都是固定尺寸的,这么用没问题,碰到这个居然不行了,唉一直在走弯路
回复

使用道具 举报

6

主题

152

帖子

1464

积分

金牌会员

Rank: 6Rank: 6

积分
1464
6#
 楼主| 发表于 2023-8-3 23:50:41 | 只看该作者
悟了悟了,看了下汇编原来这么简单,我直接定义一个变量用长整数,然后写高位和低位,再把这个变量直接传进去就好了,RECT这种16字节的估计得换另一种方法了,目前试了下什么都不写的类取出来也是占用24字节,不知道怎么自定义一个16字节的类,感觉可能还是不能完美解决等碰到再看吧
回复

使用道具 举报

15

主题

155

帖子

1798

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1798
7#
发表于 2023-8-4 07:21:29 | 只看该作者
uuyyhhjj 发表于 2023-8-3 23:50
悟了悟了,看了下汇编原来这么简单,我直接定义一个变量用长整数,然后写高位和低位,再把这个变量直接传进 ...

连续定义两个长整数不就好了~
回复

使用道具 举报

25

主题

497

帖子

1808

积分

金牌会员

Rank: 6Rank: 6

积分
1808
8#
发表于 2023-8-4 09:57:32 | 只看该作者
小小小小鸟 发表于 2023-8-4 07:21
连续定义两个长整数不就好了~

在火山用汇编,估计只能在32位程序里运行,因为64位程序与32程序汇编大不相同,请注意这点
而长整数只有在32位程序下才必须这样写这个汇编
回复

使用道具 举报

15

主题

155

帖子

1798

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1798
9#
发表于 2023-8-4 10:38:27 | 只看该作者
qaz2428119 发表于 2023-8-4 09:57
在火山用汇编,估计只能在32位程序里运行,因为64位程序与32程序汇编大不相同,请注意这点
而长整数只有在32 ...

只要在内存上是连续的就行,和汇编没关系
回复

使用道具 举报

6

主题

152

帖子

1464

积分

金牌会员

Rank: 6Rank: 6

积分
1464
10#
 楼主| 发表于 2023-8-4 15:39:00 | 只看该作者
小小小小鸟 发表于 2023-8-4 10:38
只要在内存上是连续的就行,和汇编没关系
  1.                 hr = pImageFactory->GetImage(size, SIIGBF_RESIZETOFIT, &hBitmap);
  2. 000C206E  mov         esi,esp  
  3. 000C2070  lea         eax,[ebp-60h]  
  4. 000C2073  push        eax  
  5. 000C2074  push        0  
  6. 000C2076  mov         ecx,dword ptr [ebp-6Ch]  
  7. 000C2079  push        ecx  
  8. 000C207A  mov         edx,dword ptr [ebp-70h]  
  9. 000C207D  push        edx  
  10. 000C207E  mov         eax,dword ptr [ebp-54h]  
  11. 000C2081  mov         ecx,dword ptr [eax]  
  12. 000C2083  mov         edx,dword ptr [ebp-54h]  
  13. 000C2086  push        edx  
  14. 000C2087  mov         eax,dword ptr [ecx+0Ch]  
  15. 000C208A  call        eax  
  16. 000C208C  cmp         esi,esp  
  17. 000C208E  call        __RTC_CheckEsp (0C12A8h)  
  18. 000C2093  mov         dword ptr [hr],eax  
复制代码


试了下用size模拟不行,32位崩溃了用VS看了下汇编火山里直接传2个整数参数就行,还不一样了,目前没找到16字节的例子,其实问题就出在这个参数传递得是变量本身,不能是指针,弄一个数据类型尺寸一样的话连续就可以了,想完美得改造一下调用静态方法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-17 03:04 , Processed in 0.090900 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表