开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 342|回复: 17
收起左侧

[已解决] 易语言转C代码,无法运行的问题

 关闭 [复制链接]
结帖率:50% (5/10)
发表于 2024-12-20 18:04:47 | 显示全部楼层 |阅读模式   四川省成都市
10精币
易语言代码转C代码,运行报错,求助
易语言代码:
  
子程序名返回值类型公开备 注
WxModule_Init逻辑型 
参数名类 型参考可空数组备 注
dllPath文本型
调试输出 (dllPath)
hModule = LoadLibraryA (dllPath)
返回 (hModule > 0)
子程序名返回值类型公开备 注
WxModule_UseUtf8整数型 
变量名类 型静态数组备 注
结果整数型 
i整数型 
szVersion文本型 
返回 (_Call (hModule + 十六进制 (“B5A0”)))
子程序名返回值类型公开备 注
_Call整数型 动态调用DLL中的函数命令,支持传址参数,返回函数的返回值(变量地址)
参数名类 型参考可空数组备 注
子程序地址整数型
参数1整数型
参数2整数型
参数3整数型
参数4整数型
参数5整数型
参数6整数型
参数7整数型
参数8整数型
参数9整数型
参数10整数型
参数11整数型
参数12整数型
参数13整数型
参数14整数型
参数15整数型
置入代码 ({ 86, 190, 15, 0, 0, 0, 141, 77, 8, 141, 76, 241, 252, 139, 65, 4, 133, 192, 116, 2, 255, 49, 78, 131, 233, 8, 133, 246, 117, 239, 255, 85, 8, 94, 201, 194, 124, 0 })
返回 (0)


i支持库列表   支持库注释   
spec特殊功能支持库


C语言代码:
[C++] 纯文本查看 复制代码
enum Offset {
    OPEN_INIT = 0xB5A0
};

int CallAsm(DWORD offset, DWORD p1) {
    __asm {
            push esi
            mov esi, 0000000Fh
            lea ecx, dword ptr [ebp+08h]
            lea ecx, dword ptr [ecx+esi*8-04h]
            Label2:
            mov eax, dword ptr [ecx+04h]
            test eax, eax
            je Label1
            push dword ptr [ecx]
            Label1:
            dec esi
            sub ecx, 08h
            test esi, esi
            jne Label2
            call dword ptr [ebp+08h]
            pop esi
            leave
            retn 007Ch
            };
    return 0;
}

int WxInjectInit(char *dllName) {
    char currentDir[256];
    if (GetCurrentDirectoryA(MAX_PATH, currentDir) == 0) {
        printf("获取当前目录失败");
        return FALSE;
    }
    char dllPath[256];
    snprintf(dllPath, 256, "%s\\%s", currentDir, dllName);
    HMODULE hModule = LoadLibraryA(dllPath);
    if (hModule == NULL) {
        printf("加载动态库错误:%lu", GetLastError());
        return FALSE;
    }
    DWORD moduleAddress = (DWORD) hModule + (DWORD) OPEN_INIT;
    int ok = CallAsm(moduleAddress, 0);
    return 0;
}



最佳答案

查看完整内容

// 定义函数指针--假设函数为---加法函数 typedef int (*call_func)(int,int); //需要知道函数类型以及参数类型和是否有返回值 //dllname是dll路径 bool WxModule_Init( const char* dllname) { //取模块句柄 HMODULE hModule = LoadLibraryA(dllname); call_func func = (call_func)GetProcAddress(hModule, "你想调用函数的名字"); //接收返回值 int s = func(1, 2); //s==3 printf("s=%d\n", s); } ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:50% (1/2)

签到天数: 4 天

发表于 2024-12-20 18:04:48 | 显示全部楼层   广东省广州市
// 定义函数指针--假设函数为---加法函数
typedef int (*call_func)(int,int);

//需要知道函数类型以及参数类型和是否有返回值
//dllname是dll路径
bool WxModule_Init( const char* dllname)
{
    //取模块句柄
   HMODULE hModule = LoadLibraryA(dllname);
  
   call_func func = (call_func)GetProcAddress(hModule, "你想调用函数的名字");
//接收返回值
  int s = func(1, 2);
  //s==3
  printf("s=%d\n", s);
}
回复

使用道具 举报

结帖率:50% (5/10)

签到天数: 13 天

 楼主| 发表于 2024-12-20 18:06:08 | 显示全部楼层   四川省成都市
不知道哪里翻译错了,求助大佬们
回复

使用道具 举报

结帖率:91% (10/11)

签到天数: 18 天

发表于 2024-12-20 18:55:21 | 显示全部楼层   重庆市重庆市
是不是参数数量和调用约定,+个stdcall

点评

好的 我在路上也想到了这个问题 我看平栈是用的ret 应该是stdcall的方式 回去试试 可以的话给你买杯coffee   **  发表于 2024-12-20 19:06
回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 18 天

发表于 2024-12-20 19:36:49 | 显示全部楼层   广东省深圳市
完全错了,首先你C代码里参数数量就和易语言里不一样,而且易语言可空属性和C语言里的压栈数量也完全不一样,你直接把易语言的汇编代码复制到C里不错才怪

点评

大佬能给个demo吗 一杯coffe   四川省成都市  发表于 2024-12-20 20:53
我那个汇编是用的Asm2e转的 应该没有问题吧 函数参数个数也必须保持一致吗   四川省成都市  发表于 2024-12-20 20:53
回复

使用道具 举报

结帖率:100% (26/26)
发表于 2024-12-20 22:10:11 | 显示全部楼层   山西省太原市
c没有易语言这种可空占位。

还不如简单的push A push B push C ........再Call 呢。
回复

使用道具 举报

结帖率:50% (1/2)

签到天数: 4 天

发表于 2024-12-20 22:26:09 | 显示全部楼层   广东省深圳市
1.先把寄存器的数值确定2.调用内联汇编先保存一下寄存器的值等结束的位置在还原3.建议把你要转c的函数功能详细说说

点评

项目帖子在这里:https://bbs.125.la/forum.php?mod=viewthread&tid=14828297&page=1 窗口启动 处的逻辑 我想改成c来着   四川省甘孜藏族自治州  发表于 2024-12-21 07:59
回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 18 天

发表于 2024-12-20 22:52:00 | 显示全部楼层   广东省深圳市
捕获.png
易语言C++没有和易语言里一样能设置可空属性,直接传递一个参数数量给函数时最简单的,当然也有不需要传递参数数量的稍微麻烦一点

点评

大佬 我是想把论坛里面一个项目改成c代码 这个是窗口启动处的逻辑 就几行代码 原贴在这里:https://bbs.125.la/forum.php?mod=viewthread&tid=14828297&page=1   四川省甘孜藏族自治州  发表于 2024-12-21 07:58
回复

使用道具 举报

结帖率:50% (5/10)

签到天数: 13 天

 楼主| 发表于 2024-12-21 09:11:36 | 显示全部楼层   四川省成都市
神女软件定制 发表于 2024-12-20 18:55
是不是参数数量和调用约定,+个stdcall

试了一下 好像还是不行的
回复

使用道具 举报

结帖率:50% (1/2)

签到天数: 4 天

发表于 2024-12-21 13:26:41 | 显示全部楼层   广东省深圳市
LLXXLL 发表于 2024-12-20 22:26
1.先把寄存器的数值确定2.调用内联汇编先保存一下寄存器的值等结束的位置在还原3.建议把你要转c的函数功能 ...

你就是想调用dll里面的函数是吧?函数是公开的吗?不是公开的话知道函数名字吗?

点评

都是公开的代码 易语言的代码 我也有 只要教我改写一个函数 我就会了 大佬留q我加你啊   四川省甘孜藏族自治州  发表于 2024-12-21 14:36
可以加个qq吗   四川省甘孜藏族自治州  发表于 2024-12-21 14:36
回复

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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