天道酬勤,学无止境

dllmain

加载 Qt 共享库时,Qt 小部件不显示(Qt widgets not show up when Qt shared lib loaded)

问题 要求:对于非 Qt应用程序,Qt 小部件在加载Qt 共享库时显示。 经过一些网络搜索,我发现: 所有 Qt 小部件都必须存在于“主线程”中,“主线程”是 Qt 对象创建的第一个线程。 因此,创建一个非 Qt 线程(std::thread),然后创建 QApplication 和该线程中的其他一些小部件应该可以工作,但不能。 在创建 QApplication 之前,不要在该非 Qt 线程中创建任何与 Qt 相关的对象或调用任何与 Qt 相关的静态方法。 线程解决方案对于 Mac OS 是不可移植的,我的目标平台只是 Windows,所以,没关系。 就我而言,如果应用程序加载我的 Qt 库,并调用显示小部件的方法,它就可以工作。 但出于某种原因,调用者无法手动调用我的 lib 方法。 如果宿主应用程序(加载共享库的应用程序)是 Qt 应用程序,您应该调用 QApplication::processEvents(),而不是 QApplication::exec()。 就我而言,我应该在该线程中调用 QApplication::exec() 。 源代码在这里: dll主版本: BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { if (ul_reason_for

2021-12-23 12:00:42    分类:技术分享    c++   qt   qt5   dllmain

Qt widgets not show up when Qt shared lib loaded

Requirements: Qt widgets show up when Qt shared lib loads, for none-Qt application. After some web searching, I found: All Qt widgets must live in "main thread", the "main thread" is the first Qt object created thread. so, create a none-Qt thread (std::thread), then, create QApplication and some other widgets in that thread should work, but not. Do not create any Qt related object or call any Qt related static methods before QApplication created, in that none-Qt thread. The thread solution is not portable for Mac OS, my target platform is Windows only, so, it does not matter. In my case, if

2021-12-20 20:03:13    分类:问答    c++   qt   qt5   dllmain

从 DllMain 加载/调用 ntdll(Loading/calling ntdll from DllMain)

问题 不应使用DllMain中kernel32.dll以外的函数: 来自 MS 文档: 因为在调用入口点函数时 Kernel32.dll 被保证加载到进程地址空间中,所以调用 Kernel32.dll 中的函数不会导致在执行其初始化代码之前使用该 DLL。 因此,入口函数可以调用 Kernel32.dll 中不加载其他 DLL 的函数。 例如,DllMain 可以创建关键部分和互斥锁等同步对象,并使用 TLS。 不幸的是,Kernel32.dll 中没有完整的安全函数列表。 ... 调用需要 Kernel32.dll 以外的 DLL 的函数可能会导致难以诊断的问题。 例如,调用 User、Shell 和 COM 函数可能会导致访问冲突错误,因为某些函数会加载其他系统组件。 相反,在终止期间调用这些函数可能会导致访问冲突错误,因为相应的组件可能已经被卸载或未初始化。 我的问题: 但文档没有提到ntdll.dll 。 - 我可以为“ntdll”调用LoadLibrary并从DllMain使用ntdll 中的函数: 1) 在DLL_PROCESS_ATTACH期间(加载和使用 ntdll 的函数)? 2) 在DLL_PROCESS_DETACH期间(使用先前加载的 ntdll 的函数)? 另外,请问拥有 1500 多个声誉的人会喜欢创建一个名为“dllmain”的新标签吗? 回答1 问题

2021-11-19 01:27:05    分类:技术分享    windows   loadlibrary   ntdll   dllmain

Loading/calling ntdll from DllMain

One should not use functions other than those in kernel32.dll from DllMain: From MS documentation: Because Kernel32.dll is guaranteed to be loaded in the process address space when the entry-point function is called, calling functions in Kernel32.dll does not result in the DLL being used before its initialization code has been executed. Therefore, the entry-point function can call functions in Kernel32.dll that do not load other DLLs. For example, DllMain can create synchronization objects such as critical sections and mutexes, and use TLS. Unfortunately, there is not a comprehensive list of

2021-11-12 07:39:41    分类:问答    windows   loadlibrary   ntdll   dllmain

C# 使用 DllExport 实现 DllMain(C# Implementing DllMain with DllExport)

问题 我正在使用 RobertGiesecke 的 UnmanagedExports 我想导出 DllMain 入口点。 这是我尝试过的 [DllExport("DllMain", CallingConvention.StdCall)] public static bool DllMain(IntPtr hModule, uint dwReason, byte[] lpReserved) { // I Write a text to file here return true; } 然后我调用 LoadLibrary 但没有任何反应。 有什么解决办法吗? 回答1 万岁,我找到了一种使用静态构造函数的方法。 只需将包含导出的类设为静态,并添加静态方法。 public static class Class1 { static Class1() { Console.WriteLine("DLL MAIN (Only DLL_PROCESS_ATTACH) :D"); } [DllExport("AddFunc", CallingConvention.Cdecl)] public static int AddFunc(int a, int b) { return a + b + 1; } } 当 AddFunc 调用时,程序首先调用 Class1(仅一次),然后调用 AddFunc

2021-10-15 01:42:33    分类:技术分享    c#   dllexport   dllmain

C# Implementing DllMain with DllExport

I'm using UnmanagedExports By RobertGiesecke I want to export DllMain entrypoint. Here what I've tried [DllExport("DllMain", CallingConvention.StdCall)] public static bool DllMain(IntPtr hModule, uint dwReason, byte[] lpReserved) { // I Write a text to file here return true; } Then I call LoadLibrary but nothing happens. Any solution?

2021-10-12 10:42:02    分类:问答    c#   dllexport   dllmain

如何在 DLLMain 中启动线程?(How to start a thread in DLLMain?)

问题 如何在 DLLMain 中启动线程意味着 std::thread - 从根本上说。 No 表示 WinApi,STL 表示。 当我在流程中运行该函数时,我崩溃了从这个 DLL 调用的应用程序。 先感谢您。 此代码获取文件 (exe) 上的哈希和并将其写入文件。 (* 。文本)。 但是应用程序崩溃 void initialize() { string buffer; thread t(calclulateHash, ref(buffer)); t.detach(); } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: { initialize(); break; } } return true; } 回答1 DllMain() 有一些限制。 您不应该在 DllMain 中进行任何阻塞调用,因为它是从 OS 加载程序调用的。 锁定加载程序可能会阻止某些线程启动,并且通常会导致不好的事情。 任何形式的锁定。 如果您试图获取当前由需要 OS 加载程序锁(您在从它执行时持有)的线程持有的锁,在最佳情况下您将死锁。 不允许启动线程,因为当你启动线程时.. 你通过操作系统加载器再次调用这个

2021-10-09 03:12:10    分类:技术分享    c++   multithreading   c++11   dll   dllmain

How to start a thread in DLLMain?

How can I start a thread in DLLMain means std :: thread - fundamentally. No means WinApi, and STL means. When I run the function in the flow, then I crash the application is called from this DLL. Thank you in advance. This code gets the hash sum on the file (exe) and writes it to a file. (* .txt). But the application crash void initialize() { string buffer; thread t(calclulateHash, ref(buffer)); t.detach(); } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: { initialize(); break; } } return true; }

2021-07-10 08:11:07    分类:问答    c++   multithreading   c++11   dll   dllmain