Winapi 在DllInit/loader锁中如何获取应用程序目录

Winapi 在DllInit/loader锁中如何获取应用程序目录,winapi,visual-c++,dll,Winapi,Visual C++,Dll,在dllinit/loader锁中是否有方法获取应用程序目录?目前我只知道呈现的方式。由于这种方法可能会加载Shell32.dll,因此我假设在dllinit期间它是不安全的 有什么建议/其他方法吗 澄清:我搜索的是AppData目录,而不是可执行文件所在的目录。如果要查找应用程序目录(EXE所在的目录),可以先使用,然后再使用。 这是在内核32中,因此不会加载其他DLL。如果您正在查找应用程序目录(EXE所在的位置),则可以使用,然后再使用。 这是在内核32中,因此不会加载其他DLL。您可以

在dllinit/loader锁中是否有方法获取应用程序目录?目前我只知道呈现的方式。由于这种方法可能会加载Shell32.dll,因此我假设在dllinit期间它是不安全的

有什么建议/其他方法吗



澄清:我搜索的是AppData目录,而不是可执行文件所在的目录。

如果要查找应用程序目录(EXE所在的目录),可以先使用,然后再使用。
这是在内核32中,因此不会加载其他DLL。

如果您正在查找应用程序目录(EXE所在的位置),则可以使用,然后再使用。 这是在内核32中,因此不会加载其他DLL。

您可以使用%APPDATA%(或%LOCALAPPDATA%,具体取决于您希望获取的路径)。这些函数来自kernel32.dll。

您可以使用%APPDATA%(或%LOCALAPPDATA%,具体取决于您希望获得的路径)。这些函数来自kernel32.dll。

您可以使用(使用
CSIDL\u APPDATA
CSIDL\u LOCAL\u APPDATA
)或(使用
FOLDERID\u RoamingAppData
/
FOLDERID\u LocalAppData

但是我建议使用注册表而不是标志文件。

您可以使用(使用
CSIDL\u APPDATA
CSIDL\u LOCAL\u APPDATA
)或(使用
FOLDERID\u RoamingAppData
/
FOLDERID\u LocalAppData



但是我建议使用注册表而不是标志文件。

在DllInit中,您实际上不应该做很多事情。为什么不能从初始化方法中提取代码?为什么需要读/写目录来初始化DLL?这个问题太模糊了。如果您真的想使用APPDATA环境变量,则可以使用它。还有一种可能是,不管你对字符串做什么,都会给你带来麻烦。因为我希望能够在静态初始化代码中切换代码,所以代码不应该在存在加载程序锁的情况下死锁。该目录用于为配置文件找到一个公共位置,该位置用于决定开关是开还是关。@HansPassant:是的,您必须小心字符串操作。我已经注意到了。好吧,当你真的发现配置文件包含坏数据时,你会怎么做?您没有以有意义的方式报告此问题的选项。你的动态链接库将只是行为不端,任何人都无法找出原因。如果不想添加Initialize()函数,那么在第一次需要知道配置文件包含的内容时,可以在其他导出的函数中惰性地加载配置文件。在DllInit中,您实际上不需要做很多事情。为什么不能从初始化方法中提取代码?为什么需要读/写目录来初始化DLL?这个问题太模糊了。如果您真的想使用APPDATA环境变量,则可以使用它。还有一种可能是,不管你对字符串做什么,都会给你带来麻烦。因为我希望能够在静态初始化代码中切换代码,所以代码不应该在存在加载程序锁的情况下死锁。该目录用于为配置文件找到一个公共位置,该位置用于决定开关是开还是关。@HansPassant:是的,您必须小心字符串操作。我已经注意到了。好吧,当你真的发现配置文件包含坏数据时,你会怎么做?您没有以有意义的方式报告此问题的选项。你的动态链接库将只是行为不端,任何人都无法找出原因。如果您不想添加Initialize()函数,那么在第一次需要知道配置文件包含的内容时,在其他导出的函数中延迟加载该配置文件。问题中的链接表明他正在查找AppData目录,而不是应用程序所在的目录。否则,这是一个很好的解决方案。是的,问题还不清楚。如果他们想要AppData目录,他应该使用“Init”函数或启动一个线程……问题中的链接表明他在寻找AppData目录,而不是应用程序所在的目录。否则,这是一个很好的解决方案。是的,问题还不清楚。如果他们想拥有AppData目录,他应该使用“Init”函数或启动一个线程……使用其他dll作为kernel32.dll可能会导致dll Init中的死锁和加载程序锁。建议的解决方案加载shell32.dll或advapi32.dll。如果它们还没有装载,装载锁会咬你。另一方面,读取文件是安全的。如果使用静态导入(即非GetProcAddress或延迟导入),则内核加载程序将在调用DllMain之前加载DLL。为什么不在放弃解决方案之前尝试一下呢?问题是,我的dll是由另一个dll的dllmain加载的。如果我的dll尝试加载另一个dll,它将因加载程序锁定而失败。@Tobislangner我不知道该dll如何加载你的dll,但不加载任何依赖项。如果是隐式导入DLL,那么一切都会正常工作。如果它在其
DllMain
中使用
LoadLibrary
来执行此操作,那么不管怎样。在DllMain中调用除kernel32或ntdll之外的任何DLL函数都是危险的。就我个人而言,我在使用advapi32时遇到注册表读取失败,不得不切换到ntdll。使用其他dll作为kernel32.dll可能会导致dll init中的死锁和加载程序锁。建议的解决方案加载shell32.dll或advapi32.dll。如果它们还没有装载,装载锁会咬你。另一方面,读取文件是安全的。如果使用静态导入(即非GetProcAddress或延迟导入),则内核加载程序将在调用DllMain之前加载DLL。为什么不在驳回解决方案之前试一试呢