调用静态方法碰到结构体好像会出问题,这种是用法不对吗
本帖最后由 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
……这种好像只能嵌入?不知道有没有别的大佬会。
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的话火山现在是不是完全无解? qaz2428119 发表于 2023-8-3 21:50
说白了还是因为火山本身就没有结构,火山的结构是类内部创建一个结构引用并操作 ...
我现在想全翻译成表格形式的,一开始调用的参数都是固定尺寸的,这么用没问题,碰到这个居然不行了,唉一直在走弯路 悟了悟了,看了下汇编原来这么简单,我直接定义一个变量用长整数,然后写高位和低位,再把这个变量直接传进去就好了,RECT这种16字节的估计得换另一种方法了,目前试了下什么都不写的类取出来也是占用24字节,不知道怎么自定义一个16字节的类,感觉可能还是不能完美解决等碰到再看吧 uuyyhhjj 发表于 2023-8-3 23:50
悟了悟了,看了下汇编原来这么简单,我直接定义一个变量用长整数,然后写高位和低位,再把这个变量直接传进 ...
连续定义两个长整数不就好了~ 小小小小鸟 发表于 2023-8-4 07:21
连续定义两个长整数不就好了~
在火山用汇编,估计只能在32位程序里运行,因为64位程序与32程序汇编大不相同,请注意这点
而长整数只有在32位程序下才必须这样写这个汇编 qaz2428119 发表于 2023-8-4 09:57
在火山用汇编,估计只能在32位程序里运行,因为64位程序与32程序汇编大不相同,请注意这点
而长整数只有在32 ...
只要在内存上是连续的就行,和汇编没关系 小小小小鸟 发表于 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