我写了一个dll,发现exe加载一定要把两个放一个目录才能找到。

a2468368093 2013-10-09 04:21:04
这个是就是这样,还是哪个参数可以设置吗 ?
...全文
229 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
5t4rk 2013-10-09
  • 打赏
  • 举报
回复
程序的运行要去加载所需要的dll文件,在程序运行的时候往往会遇到dll找不到的问题,或者不能确定所加载的dll文件是否是自己所需要的dll,遇到dll出问题的时候往往会不知所措,但是一旦知道了dll的加载顺序,按这个去查找解决就会方便和得心应手了。(声明下面的东西是本人从网上整理下来的,供参考学习)。 (1)先搜索可执行文件所在路径,再搜索系统路径:%PATH%(环境变量所配置的路径) 一般Path中的值为:%SystemRoot%\system32;%SystemRoot%; (2)然后按下列顺序搜索 DLL: 1、当前进程的可执行模块所在的目录。 2、当前目录。 3、Windows 系统目录。GetSystemDirectory 函数检索此目录的路径。 4、Windows 目录。GetWindowsDirectory 函数检索此目录的路径。 5、PATH 环境变量中列出的目录。
max_min_ 2013-10-09
  • 打赏
  • 举报
回复
没有什么风险,请放心使用!
赵4老师 2013-10-09
  • 打赏
  • 举报
回复
LoadLibrary The LoadLibrary function maps the specified executable module into the address space of the calling process. HINSTANCE LoadLibrary( LPCTSTR lpLibFileName // address of filename of executable module ); Parameters lpLibFileName Pointer to a null-terminated string that names the executable module (either a .DLL or .EXE file). The name specified is the filename of the module and is not related to the name stored in the library module itself, as specified by the LIBRARY keyword in the module-definition (.DEF) file. If the string specifies a path but the file does not exist in the specified directory, the function fails. When specifying a path, be sure to use backslashes (\), not forward slashes (/). If the string does not specify a path, the function uses a standard search strategy to find the file. See the Remarks for more information. Return Values If the function succeeds, the return value is a handle to the module. If the function fails, the return value is NULL. To get extended error information, call GetLastError. Remarks LoadLibrary can be used to map a DLL module and return a handle that can be used in GetProcAddress to get the address of a DLL function. LoadLibrary can also be used to map other executable modules. For example, the function can specify an .EXE file to get a handle that can be used inFindResource orLoadResource. Do not use LoadLibrary to "run" a .EXE file. If the module is a DLL not already mapped for the calling process, the system calls the DLL's DllMain function with the DLL_PROCESS_ATTACH value. If the DLL's entry-point function does not return TRUE, LoadLibrary fails and returns NULL. It is not safe to call LoadLibrary from DllMain. For more information, see the Remarks section in DllMain. Module handles are not global or inheritable. A call to LoadLibrary by one process does not produce a handle that another process can use — for example, in calling GetProcAddress. The other process must make its own call to LoadLibrary for the module before calling GetProcAddress. If no filename extension is specified in the lpLibFileName parameter, the default library extension .DLL is appended. However, the filename string can include a trailing point character (.) to indicate that the module name has no extension. When no path is specified, the function searches for loaded modules whose base name matches the base name of the module to be loaded. If the name matches, the load succeeds. Otherwise, the function searches for the file in the following sequence: The directory from which the application loaded. The current directory. Windows 95 and Windows 98: The Windows system directory. Use theGetSystemDirectory function to get the path of this directory. Windows NT: The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. The name of this directory is SYSTEM32. Windows NT: The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is SYSTEM. The Windows directory. Use theGetWindowsDirectory function to get the path of this directory. The directories that are listed in the PATH environment variable. The first directory searched is the one directory containing the image file used to create the calling process (for more information, see the CreateProcess function). Doing this allows private dynamic-link library (DLL) files associated with a process to be found without adding the process's installed directory to the PATH environment variable. The Visual C++ compiler supports a syntax that enables you to declare thread-local variables: _declspec(thread). If you use this syntax in a DLL, you will not be able to load the DLL explicitly using LoadLibrary or LoadLibraryEx. If your DLL will be loaded explicitly, you must use the thread local storage functions instead of _declspec(thread). Windows 95: If you are using LoadLibrary to load a module that contains a resource whose numeric identifier is greater than 0x7FFF, LoadLibrary fails. Windows CE: Two different modules cannot have the same filename, given that the extensions are different. These effectively have the same "module" name. For example, if LoadLibrary is made on "Sample.cpl", the operating system will not load Sample.cpl, but instead will again load Sample.dll. A similar limitation exists for modules with the same name but residing in different directories. For example, if LoadLibrary is called on "\\Windows\Sample.dll", and then LoadLibrary is called on "\\MyDir\Sample.dll", "\\Windows\Sample.dll" will simply be reloaded. A search path to the executable module cannot be specified. Unless the full path to the module is given, Windows CE will search the following path for the module: The root directory of the PC Card RAM expansion card, if one exists. The windows directory (\Windows). The root directory (\). QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winbase.h. Import Library: Use kernel32.lib. Unicode: Implemented as Unicode and ANSI versions on Windows NT. See Also Dynamic-Link Libraries Overview, Dynamic-Link Library Functions, DllMain,FindResource, FreeLibrary, GetProcAddress,GetSystemDirectory,GetWindowsDirectory, LoadLibraryEx,LoadResource
木头菇 2013-10-09
  • 打赏
  • 举报
回复
引用 2 楼 a2468368093 的回复:
[quote=引用 1 楼 bravery36 的回复:] 想要放在不同目录,只能用loadlibrary加载动态库,用函数指针来调用该库的函数.
额,怪不得,嗯,明白了,如果DLL导出一个单例类的话,会有什么风险吗?[/quote] 没风险,导出的东西类型越高级,适用性越小而已
a2468368093 2013-10-09
  • 打赏
  • 举报
回复
引用 1 楼 bravery36 的回复:
想要放在不同目录,只能用loadlibrary加载动态库,用函数指针来调用该库的函数.
额,怪不得,嗯,明白了,如果DLL导出一个单例类的话,会有什么风险吗?
bravery36 2013-10-09
  • 打赏
  • 举报
回复
想要放在不同目录,只能用loadlibrary加载动态库,用函数指针来调用该库的函数.

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧