server 发表于 2023-6-4 04:26:44

【解决方案】关于DLL动态库闪现窗口的错误问题。

总结应该是窗口程序类 代码问题。
他根本就没执行消息循环处理。
而且,如果他执行了也会卡主当dllmain不能返回。
我见有人以线程方式 执行 创建对话框,方式阻止窗口闪现。
实际上问题多多。
反思问题本质,就是没有执行消息循环,导致启动的线程自动释放而已。
而且,DLL使用线程创建窗口,可能会存在一些未知的错误。导致闪退或者崩溃。故:需要先在主线程创建一次窗口。

下面是具体实现代码,请指教了。



<火山程序 类型 = "通常" 版本 = 1 />

包 火山.程序

类 启动类 <公开 基础类 = 动态库程序类 折叠>
{
    方法 启动方法 <公开 类型 = 整数>
    {
      all.init ()
      返回 (1)
    }
}

类 all <公开 折叠>
{
    变量 myWin <公开 静态 类型 = myWin>

    方法 init <公开 静态>
    {
      wininit ()
      启动线程 (线程模板1, , , , )

    }

    方法 wininit <公开 静态 折叠>
    {
      变量 win <类型 = 变整数>
      win = 创建对象指针 (窗口)
      读指针处对象 (win, 窗口).创建窗口 ()
      销毁对象指针 (win)
    }

    方法 线程模板1 <静态 类型 = 整数 注释 = "提供线程执行函数的模板方法" 返回值注释 = "返回值未被使用">
    参数 用户参数 <类型 = 变整数 注释 = "为启动线程线程时所提供的用户参数值">
    {
      all.myWin.创建窗口 (, , , , )
      消息循环 ()
      返回 (0)
    }

    方法 消息循环 <公开 静态 折叠>
    {
      @ MSG msg;
      @ while (GetMessage (&msg, NULL , 0, 0))
      @ {
      @   TranslateMessage (&msg);
      @   DispatchMessage (&msg);
      @ }
    }

    #
}

类 myWin <基础类 = 窗口 折叠 折叠2 隐藏值属性 = "0" @视窗.布局 = "client_size = \"290, 119\"" 标题 = "test">
{

    #
}


ps:天天在论坛哔哔 被人嫌弃,哎。。。



server 发表于 2023-6-4 04:30:36

ps:

不要在DLL 所有创建的窗口内预设 底图 等非基础操作。
会闪退或报错,之前给3D摄像机写插件的时候发现的。
页: [1]
查看完整版本: 【解决方案】关于DLL动态库闪现窗口的错误问题。