问题标签 [dllmain]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4855 浏览

c++ - Windows Vs 上的 DLL Main __attribute__((constructor)) Linux 上的入口点

考虑代码

EXE文件:

动态链接库

输出不同:

在窗户上

Linux

在 Windows 上,Moo 构造函数在 DLLMain 之前调用,而在 linux 上,它在使用属性((构造函数))定义的 Initializer 之后调用。

为什么?

0 投票
1 回答
255 浏览

c++ - 在 dllmain() / DLL_PROCESS_ATTACH 中允许实例化 com 对象?

DLLMAIN() /中加载 DLLDLL_PROCESS_ATTACH可能会导致问题。但是可以COM Objects使用 eq CoInitialize() / CoCreateInstance() 实例化?

编辑:问题是:在这种情况下创建 COM 实例会导致类似的错误,例如加载 DLL 吗?在我看来,加载 DLL 和创建 COM 实例在某种程度上类似。

0 投票
0 回答
50 浏览

c++ - 如何避免DLL Main?

我以前问过这个问题,尽管人们忽略了它。再说一遍,这是一个冗长的话题,因此我会尽量缩短。

当您将 DLL 注入到您不拥有的程序中时,如何避免使用 DLL Main?很多人可能都知道,例如在 DLL main 中使用线程时,它只会导致程序停止(在大多数情况下)。

我真的很想知道从注入的 DLL 中实际运行线程而不将其放入 DLL Main 的最佳方法......这对我来说似乎是不可能的,因为我不知道如何。

我知道您可以将程序必须加载的已编译 .dll 放入文件夹中,但它不是真正的 DLL,例如 DirectX,并加载所需的 DLL,但我目前正在这样做,这意味着通过控制我的程序DirectX 黑客。有人已经注入另一个程序(根据 MySQL 调试日志)。我知道这无论如何都可以用注射器来完成,但这会更难。

有谁知道一种方法,因为我现在可以杀了一个?

编辑:对于这个线程是重复的,它不是我已经使用这个注入我的 DLL。

但是,在注入的 DLL 中使用 DllMain 会导致系统停止,因为我已经达到了太多的地步。

我需要一种方法来防止系统停止,并可能在 DLLMain 之外创建线程,例如,可能是一种无需在我注入的 DLL 中使用 DLLMain 即可启动 DLL 线程的方法。

0 投票
2 回答
1446 浏览

winapi - 为什么不能从 DllMain 函数调用 CreateProcess?

我已经阅读了一些CreateProcess不能从DllMain函数调用的来源。

创建过程

不要从 DllMain 函数调用 CreateProcess。这会导致应用程序停止响应。

动态链接库最佳实践

您永远不应在 DllMain 中执行以下任务: 调用 CreateProcess。创建一个进程可以加载另一个 DLL。

问题

这是为什么?它指出它会导致应用程序停止响应,但这只是一个症状。真正的原因是什么?

我问的原因是我尝试从一个DllMain函数创建一个进程,它看起来工作得很好。

0 投票
0 回答
661 浏览

c++ - 动态链接库最佳实践 - 如何避免死锁?

背景

我已阅读Dynamic-Link Library Best Practices并了解在DllMain中我能做什么和不能做什么。

现在,假设我有一个包含许多项目的 Visual Studio 2013 解决方案。每个项目生成不同的二进制文件/lib 文件。

假设我有一些实用程序项目,生成一个所有项目都使用的 lib 文件。

现在,这个实用程序项目可能会定义一些调用的通用函数,例如,基于上面链接的LoadLibrary 函数是这样的:永远不要从 DllMain 中执行以下任务

问题

  1. 我如何实现一个通用函数,“知道”它不能使用某些 API,因为它是在DllMain函数范围内被调用的?

  2. 是否可以访问 Windows 加载程序锁定,并在锁定时禁用某些调用或更改函数的算法?

例子

项目实用程序

项目A

项目 B

虽然对函数的调用在GetUserName()中非常好Project B,但在Project A

我想以避免这种情况的方式使 mu 解决方案变得聪明。

理论方法

当然,这if( IsLoaderLocked() )不是真正的代码。只是我想在调用“危险”API 之前评估的条件示例。

0 投票
1 回答
148 浏览

c++ - C++ DllMain API 调用

这可能是显而易见的,但对我来说没有多大意义。我正在尝试创建一个要使用 C++ 注入游戏进程的 dll。我已经读过我不应该从这个方法中调用像 CreateThread 这样的东西,因为它是“危险的”。如果我有这样的另一种方法,它仍然危险吗?(伪):

如果这不安全,究竟应该怎么做?

0 投票
1 回答
3398 浏览

c++ - 为什么 DLL_THREAD_DETACH 会发生两次?

我正在学习 COM。我在 DLL 中编写了一个简单的 COM 组件,并在注册表中注册了它。然后我创建了一个简单的客户端并尝试使用我的 COM 组件。但我不明白这种DllMain行为(我也读过这个)。

我希望每个DLL_PROCESS_ATTACHDLL_PROCESS_DETACH都被调用,并且每个DLL_THREAD_ATTACHDLL_THREAD_DETACH都被调用(如果没有发生异常)。

但我看到一个DLL_PROCESS_ATTACH有两个DLL_THREAD_DETACH

在此处输入图像描述

为什么会这样?

0 投票
2 回答
1818 浏览

c++ - 从 DLLMain 调用托管代码

我正在编写一个非托管 dll(使用 c++ 和 WinAPI),但我想使用一些 C# 方法,因此,我使用 C++/CLI 创建了一个包装器。

但问题是:非托管 dll 将被“注入”(LoadLibrary),我被困在这里,不知道如何调用 Wrapper 函数。

非托管代码:

包装器(C++/CLI):

我不知道这里发生了什么。.NET 环境没有加载?Wrapper DLL 没有加载?(我遍历了模块并且包装器不存在)。

我必须手动初始化 CLR 吗?

我阅读了有关加载程序锁定的信息,但我不确定这是否是这里的问题。

0 投票
0 回答
618 浏览

c++ - DllMain 中的 DLL_PROCESS_DETACH 中的 C++ 代码未执行

我有一个client和一个server用 C++ 编写的。在client里面,dllserver里面.exe。我首先启动server然后dll在其中注入explorer.exe client。当我启动client并发送消息时,DLL_PROCESS_ATTACH它工作正常client并且server正在通信。

但是当我重新启动 explorer.exe 并且dll卸载意味着DLL_PROCESS_DETACH应该调用它时,这意味着当我启动并向fromclient发送消息时它也应该可以工作,但它没有。我正在使用 Windows 10 机器和 VS2015。serverDLL_PROCESS_DETACH

这是我的代码

服务器

0 投票
2 回答
399 浏览

c++ - 使用和不使用 Visual Studio 调用 dll 文件

这是我的代码 -

所以问题是,如果安装了 Visual Studio,这个函数工作正常,我可以在 e:\temp\ 文件夹中创建 DllMain.txt,但如果没有安装 Visual Studio,函数调用有问题。Explorer 无法调用此函数。更多信息在我正在尝试的编辑部分中给出。

我正在使用以下设置构建一个 dll 文件,请检查此链接

制作dll的属性设置

我正在为邮件客户端实现 Windows 的“发送到”协议。所以我需要构建一个 dll 并且我必须在 Windows 中将我的应用程序注册为电子邮件客户端。因此,如果用户为 Outlook 和 Thunderbird 等默认电子邮件客户端选择我的应用程序,我需要一个 dll 来执行某些任务。

示例 - 选择一个文件 ->(右键单击)发送到 -> 邮件收件人。

这里资源管理器调用 dll 文件。如果安装了视觉工作室,则完美无缺。在未安装 Visual Studio 的电脑上尝试,结果错误消息,然后我在安装 Visual Studio 后尝试并得到了我想要的结果。

我不想强迫我的用户安装 MSVC 运行时。因为如果您了解 Thunderbird(Mozilla 产品),那么 Thunderbird 可以在没有 MSVC 运行时的情况下完成这项工作。