uuyyhhjj 发表于 2023-8-3 14:41:07

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

本帖最后由 uuyyhhjj 于 2023-8-3 14:45 编辑

      HRESULT ( STDMETHODCALLTYPE *GetImage )(
            __RPC__in IShellItemImageFactory * This,
            /* */ SIZE size,
            /* */ SIIGBF flags,
            /* */ __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:26

……这种好像只能嵌入?不知道有没有别的大佬会。

qaz2428119 发表于 2023-8-3 21:50:52

说白了还是因为火山本身就没有结构,火山的结构是类内部创建一个结构引用并操作

uuyyhhjj 发表于 2023-8-3 23:14:45

创世魂 发表于 2023-8-3 16:59
……这种好像只能嵌入?不知道有没有别的大佬会。

hr = pImageFactory->GetImage(size, 8, &hBitmap);
00007FF695DF1C80mov         rax,qword ptr
00007FF695DF1C87mov         rax,qword ptr
00007FF695DF1C8Alea         r9,
00007FF695DF1C91mov         r8d,8
00007FF695DF1C97mov         rdx,qword ptr
00007FF695DF1C9Emov         rcx,qword ptr
00007FF695DF1CA5call      qword ptr
00007FF695DF1CA8mov         dword ptr ,eax

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

uuyyhhjj 发表于 2023-8-3 23:18:19

qaz2428119 发表于 2023-8-3 21:50
说白了还是因为火山本身就没有结构,火山的结构是类内部创建一个结构引用并操作 ...

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

uuyyhhjj 发表于 2023-8-3 23:50:41

悟了悟了,看了下汇编原来这么简单,我直接定义一个变量用长整数,然后写高位和低位,再把这个变量直接传进去就好了,RECT这种16字节的估计得换另一种方法了,目前试了下什么都不写的类取出来也是占用24字节,不知道怎么自定义一个16字节的类,感觉可能还是不能完美解决等碰到再看吧

小小小小鸟 发表于 2023-8-4 07:21:29

uuyyhhjj 发表于 2023-8-3 23:50
悟了悟了,看了下汇编原来这么简单,我直接定义一个变量用长整数,然后写高位和低位,再把这个变量直接传进 ...

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

qaz2428119 发表于 2023-8-4 09:57:32

小小小小鸟 发表于 2023-8-4 07:21
连续定义两个长整数不就好了~

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

小小小小鸟 发表于 2023-8-4 10:38:27

qaz2428119 发表于 2023-8-4 09:57
在火山用汇编,估计只能在32位程序里运行,因为64位程序与32程序汇编大不相同,请注意这点
而长整数只有在32 ...

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

uuyyhhjj 发表于 2023-8-4 15:39:00

小小小小鸟 发表于 2023-8-4 10:38
只要在内存上是连续的就行,和汇编没关系
                hr = pImageFactory->GetImage(size, SIIGBF_RESIZETOFIT, &hBitmap);
000C206Emov         esi,esp
000C2070lea         eax,
000C2073push      eax
000C2074push      0
000C2076mov         ecx,dword ptr
000C2079push      ecx
000C207Amov         edx,dword ptr
000C207Dpush      edx
000C207Emov         eax,dword ptr
000C2081mov         ecx,dword ptr
000C2083mov         edx,dword ptr
000C2086push      edx
000C2087mov         eax,dword ptr
000C208Acall      eax
000C208Ccmp         esi,esp
000C208Ecall      __RTC_CheckEsp (0C12A8h)
000C2093mov         dword ptr ,eax

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