递归火山软件开发平台

标题: 调用静态方法碰到结构体好像会出问题,这种是用法不对吗 [打印本页]

作者: uuyyhhjj    时间: 2023-8-3 14:41
标题: 调用静态方法碰到结构体好像会出问题,这种是用法不对吗
本帖最后由 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


作者: 创世魂    时间: 2023-8-3 16:59
……这种好像只能嵌入?不知道有没有别的大佬会。
作者: qaz2428119    时间: 2023-8-3 21:50
说白了还是因为火山本身就没有结构,火山的结构是类内部创建一个结构引用并操作
作者: uuyyhhjj    时间: 2023-8-3 23:14
创世魂 发表于 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的话火山现在是不是完全无解?
作者: uuyyhhjj    时间: 2023-8-3 23:18
qaz2428119 发表于 2023-8-3 21:50
说白了还是因为火山本身就没有结构,火山的结构是类内部创建一个结构引用并操作 ...

我现在想全翻译成表格形式的,一开始调用的参数都是固定尺寸的,这么用没问题,碰到这个居然不行了,唉一直在走弯路
作者: uuyyhhjj    时间: 2023-8-3 23:50
悟了悟了,看了下汇编原来这么简单,我直接定义一个变量用长整数,然后写高位和低位,再把这个变量直接传进去就好了,RECT这种16字节的估计得换另一种方法了,目前试了下什么都不写的类取出来也是占用24字节,不知道怎么自定义一个16字节的类,感觉可能还是不能完美解决等碰到再看吧
作者: 小小小小鸟    时间: 2023-8-4 07:21
uuyyhhjj 发表于 2023-8-3 23:50
悟了悟了,看了下汇编原来这么简单,我直接定义一个变量用长整数,然后写高位和低位,再把这个变量直接传进 ...

连续定义两个长整数不就好了~
作者: qaz2428119    时间: 2023-8-4 09:57
小小小小鸟 发表于 2023-8-4 07:21
连续定义两个长整数不就好了~

在火山用汇编,估计只能在32位程序里运行,因为64位程序与32程序汇编大不相同,请注意这点
而长整数只有在32位程序下才必须这样写这个汇编
作者: 小小小小鸟    时间: 2023-8-4 10:38
qaz2428119 发表于 2023-8-4 09:57
在火山用汇编,估计只能在32位程序里运行,因为64位程序与32程序汇编大不相同,请注意这点
而长整数只有在32 ...

只要在内存上是连续的就行,和汇编没关系
作者: uuyyhhjj    时间: 2023-8-4 15:39
小小小小鸟 发表于 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字节的例子,其实问题就出在这个参数传递得是变量本身,不能是指针,弄一个数据类型尺寸一样的话连续就可以了,想完美得改造一下调用静态方法
作者: qaz2428119    时间: 2023-8-5 11:05
小小小小鸟 发表于 2023-8-4 10:38
只要在内存上是连续的就行,和汇编没关系

我只是说了我的见解,至于你的见解,那只能是你的事




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4