递归火山软件开发平台

标题: 听劝的吴老板最可爱 [打印本页]

作者: urenai    时间: 2024-12-31 23:06
标题: 听劝的吴老板最可爱
本帖最后由 urenai 于 2024-12-31 23:07 编辑

来来来,赶紧贴上二维码,赞助你两毛钱。

玩归玩闹归闹。
本次更新 DLL支持定位输出序号,非常棒。
  1.   按下 "ESC" 键关闭这窗口         

  2. 模块名称:nullDll.dll  
  3. 更多
  4.         TimeDateStamp: FFFFFFFF
  5.         版本: 0.00   
  6.         序数基址: 00000001   
  7.         函数编号: 00000002           
  8.         编号名称: 00000001      
  9.         
  10.   无名称  rva: 00001070 ord:   1
  11.   _a_ rva: 00001060 ord:   2
复制代码
吴总已经讲过规则了。
在这里,我再简单阐述一下:
@输出名=“apiname”        // 编译结果  导出函数名:apiname
@输出名=“apiname_1_”   // 编译结果  导出函数名:apiname   该导出函数所在导出表第  1  位;
@输出名=“apiname_1n_”   // 编译结果  导出函数名:无名称   该导出函数所在导出表第  1  位;
这里的无名称 就是字面意思,实际上没有字符。

应该时讲清楚了吧。
散会

@飞扬工作室  如果可以,能否修复DLL在某种应用下 内存运行 报错问题?

问题代码已经找到了,就是没能力继续搞下去,暂时只能阉割掉启动类 临时解决,关键是不知道有没有后遗症。
如果不打算修复,希望官方能回应一下,这么搞 阉割启动类 会不会有影响:
之前搞DLL报错的童鞋们 进来。 - 火山平台俱乐部 - 递归火山软件开发平台 - Powered by Discuz!



作者: ywl    时间: 2024-12-31 23:15
膜拜
作者: 拒绝吃鱼的猫    时间: 2025-1-1 04:25
膜拜 前来支持啊
作者: niuyanbo2021    时间: 2025-1-1 07:56
没看懂,你讲的是在DLL里实现按ESC关闭窗口这个功能,是吗?
这个问题我也卡住了好久。
作者: 山梦    时间: 2025-1-1 08:03

膜拜 前来支持啊
作者: lhy201233    时间: 2025-1-1 11:31
这个应该是函数名在汇编中地址吧
作者: urenai    时间: 2025-1-1 13:21
lhy201233 发表于 2025-1-1 11:31
这个应该是函数名在汇编中地址吧

类库导出表细化设置
作者: fengshangren    时间: 2025-1-1 18:25
内存运行报错,你是查到哪里出了,我也研究了两天,也是找到问题了,我这边测试是Win7的火山DLL内存调用百分百崩,你是查到哪里有问题
作者: urenai    时间: 2025-1-1 20:23
fengshangren 发表于 2025-1-1 18:25
内存运行报错,你是查到哪里出了,我也研究了两天,也是找到问题了,我这边测试是Win7的火山DLL内存调用百 ...

童鞋,已经解决了,按照我帖子把启动类和谐了就行。
作者: fengshangren    时间: 2025-1-2 12:43
本帖最后由 fengshangren 于 2025-1-2 12:46 编辑
urenai 发表于 2025-1-1 20:23
童鞋,已经解决了,按照我帖子把启动类和谐了就行。

你错了,治标不治本,他火山的一些库的封装方式,都是启动类的一些源码写法一样,只要你调用了那个库,你依然不能内存调用,一样崩,比如你DLL调用了官方封装的HP库,你这个DLL依然不能被内存调用,除非你DLL写的代码很简单,不怎么调用官方的库,那基本还可以
作者: urenai    时间: 2025-1-2 13:02
fengshangren 发表于 2025-1-2 12:43
你错了,治标不治本,他火山的一些库的封装方式,都是启动类的一些源码写法一样,只要你调用了那个库,你 ...

深入讲讲呢
作者: urenai    时间: 2025-1-2 13:32
fengshangren 发表于 2025-1-1 18:25
内存运行报错,你是查到哪里出了,我也研究了两天,也是找到问题了,我这边测试是Win7的火山DLL内存调用百 ...

深入聊聊你发现的问题呢?
作者: urenai    时间: 2025-1-2 13:34
fengshangren 发表于 2025-1-1 18:25
内存运行报错,你是查到哪里出了,我也研究了两天,也是找到问题了,我这边测试是Win7的火山DLL内存调用百 ...

*\vol_dev\up_chs_person\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_classes.cpp
    // 必须放在最后,以防用户程序在类的构造方法中访问前面的信息.
    m_pVolAppObject = (CVolUserApp*)pVolAppRuntimeClass->CreateObject ();
复制代码


核心cpp文件,这行代码执行了,必定报错。
你发现的呢?
作者: fengshangren    时间: 2025-1-2 16:16

namespace rg_n {
        class MyClass {
        public:
                // 构造函数和析构函数现在不需要额外的参数
                MyClass() {}
                ~MyClass() {}

                // 假设的静态函数,用于演示(实际上不创建对象)
                static void sCreateNewObject() {
                        std::cout << "Creating new MyClass object (but not really)" << std::endl;
                }


                // 修正后的宏定义
#define _DECLARE_GLOBAL_VOL_RUNTIME_CLASS(class_name) \
        static CVolRuntimeClass* sGetRuntimeClass() { \
            static CVolRuntimeClass s_infRuntimeClass(#class_name); \
            return &s_infRuntimeClass; \
        }

        // 应用宏到MyClass类
                _DECLARE_GLOBAL_VOL_RUNTIME_CLASS(MyClass)

                static CVolRuntimeClass* sGetRuntimeClasssa()
                {

                        static CVolRuntimeClass s_infRuntimeClassa("rg_n::MyClass");
                        return &s_infRuntimeClassa;
                }



        };

}

(, 下载次数: 259)

火山的代码中有这种写法的,这种宏和静态方法的写法和调用,都不能内存加载,他会在汇编里生成一个汇编指令mov ecx ,fs:[2Ch],这个可以网上查,是取的指向线程局部存储(Thread Local Storage,TLS)数据的指针。TLS指针的主要作用是提供对线程局部存储的访问,使得每个线程可以拥有自己的数据副本,互不干扰‌,但是被内存加载的DLL取不出这个数据指针,取出来的是错误的,特别是其它语言,比如易语言内存调用火山的DLL,在win7测试百分百出错,我在win10测试,这个指针取出来又是对的,win7取出来就是0,取不出来导致 崩溃,启动类为什么会出错,因为他也会生成这条指令,但是封装的库里面有很多这样的汇编指令,只要他是以上这种写法,都会生成这种指令,你可以改代码,换种方式实现,也会正常,但是工作量太大,我已经放弃了



作者: urenai    时间: 2025-1-2 19:14
fengshangren 发表于 2025-1-2 16:16
namespace rg_n {
        class MyClass {
        public:

你比我研究的更深入、

@飞扬工作室
动动小手的事,能给解决了吗??
作者: urenai    时间: 2025-1-2 19:16
urenai 发表于 2025-1-2 19:14
你比我研究的更深入、

@飞扬工作室

我们都在为了火山的发生更好而做出努力,
希望官网不要漠视。
作者: 飞扬工作室    时间: 2025-1-2 21:49
fengshangren 发表于 2025-1-2 16:16
namespace rg_n {
        class MyClass {
        public:

你的意思是凡是定义了静态变量的dll都不能内存载入? 那这个范畴就有点广了.
作者: fengshangren    时间: 2025-1-2 23:24
你QQ多少加好友研究下吧
作者: urenai    时间: 2025-1-3 00:14
fengshangren 发表于 2025-1-2 23:24
你QQ多少加好友研究下吧

吴老板 Q 3251044

我的就不发了,我很菜。
作者: 风一样存在    时间: 2025-1-3 17:59
自己靠边慢慢想,想多了自然也就懂了
作者: urenai    时间: 2025-1-3 20:12
niuyanbo2021 发表于 2025-1-1 07:56
没看懂,你讲的是在DLL里实现按ESC关闭窗口这个功能,是吗?
这个问题我也卡住了好久。 ...

直接消息子类化,你自己处理主窗口的消息循环,
当得到按键消息-> esc 键 按下时,执行你想执行的操作。




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