DLL中如何获取自身的句柄

问题:DLL中如何获取DLL自身所在的文件夹,而不是主调程序的。用GetCurrentDirectory获取的是exe主调程序所在的目录,不符合我的要求;用GetModuleFileName只能在DllMain中才能获取到,因为DllMain第一个参数hInstance就是DLL模块局并,而GetModuleFileName()只有传入DLL模块句柄才能获取DLL路径。

但是,如果不是DllMain项目,而是Win32
DLL勾选MFC选项的项目,入口函数是int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]),没有DllMain那样的入参hInstance,又该如何获取DLL的模块句柄呢?

方法1:传入句柄

使用一个全局变量保存DllMain中的hInstance,然后在你需要的地方传给::GetModuleFileName。

方法2:传入DLL名称

HMODULE hMod = GetModuleHandle(_T("mydll.dll"));
if(hMod != NULL)
{
    TCHAR szBuffer[MAX_PATH] = {0};
    GetModuleFileName(hMod, szBuffer, sizeof(szBuffer) / sizeof(TCHAR) - 1);
}

方法3:通用办法

TCHAR szDLLFolder[MAX_PATH + 1];
GetModuleFileName(AfxGetApp()->m_hInstance, szDLLFolder, MAX_PATH);

先补充说明一下,VC有三种DLL项目

(1)MFC扩展DLL (dll被加载自动进入入口函数DllMain,但最好通过导出接口来使用)

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

(2)Win32标准DLL (dll被加载自动进入入口函数DllMain,但最好通过导出接口来使用)

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )

(3)Win32勾选MFC选项DLL(dll被加载不会进入函数_tmain(),只能提供导出接口)

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
时间: 2024-10-13 00:27:30

DLL中如何获取自身的句柄的相关文章

C# 获取窗体的句柄和获取窗体中的空间

获取窗体的句柄 FindWindow,用来根据类名和窗口名来得到窗口句柄.但是这个函数不能查找子窗口,也不区分大小写.如果要从一个窗口的子窗口中查找需要使用的FindWindowEX. 1.在C#中使用方法如下: [DllImport("User32.dll",EntryPoint="FindWindow")] private static extern IntPtr FindWindow(string lpClassName,string lpWindowName

C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客

原文:C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客 public static List<T> CreateTarInterface<T>(string dllpath) { List<T> rs = new List<T>(); var dlllll = Assembly.Load(dllpath); foreach (var item in dlllll.GetTypes()) { object ob

C# 获取DLL中需要的接口类

[ 需求 ] 使用反射,循环本地DLL文件,获取实现了所需接口的类,并实例化. Loop local dll files by reflection library and assembly library to find all the classes that implement certain interface and create instances for them. 二话不说,先上代码. Talk is cheap. Show me the code. 1 using System

C#根据进程名称获取进程的句柄?

C#根据进程名称获取进程的句柄或C#如何获取其他进程的句柄? 不用FindWindow方法! [StructLayout(LayoutKind.Sequential)] public struct ProcessEntry32 { public uint dwSize; public uint cntUsage; public uint th32ProcessID; public IntPtr th32DefaultHeapID; public uint th32ModuleID; public

C#依据进程名称获取进程的句柄?

C#依据进程名称获取进程的句柄或C#怎样获取其它进程的句柄? 有时候标题名是动态变化的,所以不使用FindWindow方法! [StructLayout(LayoutKind.Sequential)] public struct ProcessEntry32 { public uint dwSize; public uint cntUsage; public uint th32ProcessID; public IntPtr th32DefaultHeapID; public uint th32

在C++中调用DLL中的函数(2)

转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息. Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构.另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录, 2.进程的当前工作目录, 3.Windows系统

MFC的DLL中实现定时器功能

方法一:创建一个线程, 反复读系统时间不就可以了? 如果定时要求不严,用Sleep就可以了.DWORD WINAPI TimerThread(LPVOID pamaram) { UINT oldTickCount, newTickCount; oldTickCount = GetTickCount(); //获取的是毫秒数 while(TRUE) { while(TRUE) { newTickCount = GetTickCount(); // 获取的是毫秒数 if(newTickCount -

如何隐藏DLL中,导出函数的名称?

一.引言 很多时候,我们写了一个Dll,不希望别人通过DLL查看工具,看到我们的导出函数名称.可以通过以下步骤实现: 1. 在def函数中做如下定义: LIBRARY EXPORTS HideFuncName @1 NONAME 通过添加NONAME关键字,隐藏函数名,这样的话,用Dependency Walker来查看该Dll,只能看到如下结果: 2. 如何调用该Dll中的函数,通过ID的方式调用,代码如下: 1 typedef void (WINAPI *FPHideFuncName)();

.Net中把图片等文件放入DLL中,并在程序中引用

[摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵. 本文就讲述了如何把文件(比如图片,WORD文档等等) 隐藏到DLL中,然后在程序中可以自己根据需要导出图片进行处理. 注:本站原创,转载请注明本站网址:http://www.beinet.cn/blog/ [全文] 第1步:我们要生成一个资源文件,先把要隐藏的文件放入到这个资源文件中 (资源文件大致可以存放三种数据资源:字节数组.各种对象和字符串) 首