标签: loadlibrary

在64位应用程序中加载32位DLL库

有没有办法加载32位DLL库(具有与LoadLibrary相同的用法)我想使用该函数和GetProcAddress.

我看了WOW,但它似乎没有提供功能.功能应该存在,因为像DependencyWalker这样的工具能够读取32位dll的符号,即使它的64位也是如此.

谢谢

dll loadlibrary getprocaddress

39
推荐指数
2
解决办法
7万
查看次数

DLL加载库 - 错误代码126

我正在使用Windows API中的"LoadLibrary",当我运行应用程序时,它会抛出一个错误代码126.我读到它可能是由依赖引起的,我检查了一些应用程序如Dependency Walker的问题,但是一切很好.

应用程序中的LoadLibrary:

            HMODULE dll_mod = LoadLibrary(L"path_to_dll");
            if(dll_mod==NULL){
                std::stringstream error;
                error << "Could not load plugin located at:\n" << file_full.toStdString() << "\n" << "Error Code: " << GetLastError();
                FreeLibrary(dll_mod);
                return error.str();
            }
Run Code Online (Sandbox Code Playgroud)

插件代码:

#include "stdafx.h"
#define DLL_EXPORT
#define PLUGIN_STREAM __declspec(dllexport)
#include <iostream>
#include <vector>
using std::vector;
using std::string;
// Init event (After the loading)
extern "C"{
PLUGIN_STREAM int onInit(char* argv){
return 0;
}
PLUGIN_STREAM void pluginInfo(vector<string> & info){
info.push_back("media_event=false");
    info.push_back("status_event=false");
    info.push_back("send_event=true");
    info.push_back("plugin_name='RadioStream'");
    info.push_back("description='This plugin was designed for that people …
Run Code Online (Sandbox Code Playgroud)

c++ dll plugins loadlibrary

30
推荐指数
2
解决办法
9万
查看次数

C/C++动态链接如何在不同的平台上运行?

动态链接如何工作?

在Windows(LoadLibrary)上,您需要在运行时调用.dll,但在链接时,您需要提供相应的.lib文件,否则程序将无法链接... .lib文件包含什么?.dll方法的描述?这不是标题包含的内容吗?

相关地,在*nix上,您不需要lib文件...编译器如何知道标头中描述的方法在运行时可用?

作为一个新手,当你想到两个方案中的任何一个,然后另一个,它们都没有意义......

c c++ compilation loadlibrary dynamic-linking

25
推荐指数
3
解决办法
6844
查看次数

LoadLibrary是否创建不同的实例?

如果我使用Win32 API LoadLibrary连续3次加载相同的DLL,它应该返回3个不同的句柄,每个库中的函数应该都有不同的地址是否正确?(或者它是否做了"智能"操作并检测是否已经为进程加载了dll并且只是指向同一个模块?)

winapi loadlibrary

21
推荐指数
2
解决办法
8886
查看次数

LoadLibrary()错误代码127

我在使用LoadLibrary()时遇到问题并收到一条对我没有意义的错误:

   ::SetLastError(0);

   m_hDll = ::LoadLibrary(szName);

   if (m_hDll == NULL) // Failure to load the DLL.
   {
      DWORD err = GetLastError();
   }
Run Code Online (Sandbox Code Playgroud)

错误是127("无法找到指定的过程.") 这对我调用LoadLibrary()没有任何意义. 我还没有调用GetProcaddress().

DLL(和应用程序)都使用VS ++ 2005 SP1编译.

怎么可能出错?

loadlibrary visual-c++

19
推荐指数
3
解决办法
4万
查看次数

C++中的GetProcAddress函数

大家好:我已经在我的项目中加载了我的DLL,但每当我使用GetProcAddress函数时.它返回NULL!我该怎么办?我在"MYDLL.dll"中使用此函数(双GetNumber(double x))

这是我使用的代码:

typedef double (*LPGETNUMBER)(double Nbr);
HINSTANCE hDLL = NULL;
LPGETNUMBER lpGetNumber;
hDLL = LoadLibrary(L"MYDLL.DLL");
lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");
Run Code Online (Sandbox Code Playgroud)

c++ dll loadlibrary getprocaddress

16
推荐指数
1
解决办法
5万
查看次数

我的DLL代码来自exe文件,但无法从Java loadLibrary加载

我创建了一个C++模块来构建一个共享库文件,然后使用JNI从Java调用它.

我有两个环境,Windows和Unix,我有一个C++可执行程序和一个Java程序,我只是为每个环境重新编译.

  • 当我在Unix中编译我的tester.exe程序并使用我的库(.so)中的方法运行它时,它工作正常.
  • 当我在Unix中编译我的Java程序并使用Java的loadLibrary加载我的库(.so)时,它工作正常.
  • 当我在Windows中编译tester.exe程序并使用我的库(.dll)中的方法运行它时,它工作正常.就像unix版本一样.

  • 当我在Windows中编译我的Java程序并使用Java的loadLibrary加载我的库(.dll)时,它失败了.它说尝试访问无效地址.

我无法弄清楚为什么它在Windows中运行时无法使用Java loadLibrary,但它可以在其他地方使用相同的代码.如果我延迟加载我的库使用的依赖DLL,那么我的库在Java中加载但不起作用.我知道有一些特定的代码导致Java加载我的库的问题,但我无法弄清楚为什么我的C++ exe对相同的方法和库没有问题.


我的dll有一个公开的方法,它从一些现有的库中调用4个方法.如果我评论这4个方法,那么我的DLL加载Java很好.我知道这与我的dll链接到的库中的这些方法有关.Java是如何看待依赖库的?我首先尝试加载依赖库,但是我加载的一个dll文件导致递归错误并且堆栈溢出.

任何人都知道一种方法导致堆栈从递归错误溢出?我需要其中的方法,但我不能用java loadLibrary加载它.


以下是有关所涉及文件和实际错误消息的更多详细信息.我在我的inital dll文件中添加了一个DllMain,只是为了看看什么载荷和什么时候.如果我将同一个程序(my_plain_dll_to_call_JNI_DLL)编译为exe文件,一切正常.如果我编译它并从我的java程序加载它会发生这种情况.

  • myJavaProgram,只需调用System.loadLibrary()来加载一个基本的.dll文件,该文件调用我的另一个包含JNI代码的dll中的方法.
  • my_plain_dll_to_call_JNI_DLL是我创建的一个dll,它是通过将它链接到我的dll库文件来测试依赖项.它只是从另一个调用我需要的本机代码的dll调用一个方法.
  • my_JNI_DLL.ll是一个与我需要从JNI访问的现有C++编程库链接的DLL文件.它包含对现有源代码库中方法的直接调用.

我写了文件名,显示每行左边的文本,以显示执行所在的层.


c:\java myJavaProgram
myJavaProgram: Java Static Method Entry.

myJavaProgram: Java Calling System.loadLibrary(my_plain_dll_to_call_JNI_DLL)

my_JNI_DLL.dll: Entering DllMain

my_JNI_DLL.dll: DLL_PROCESS_ATTACH

my_plain_dll_to_call_JNI_DLL: DLL_PROCESS_ATTACH
my_plain_dll_to_call_JNI_DLL: DLL_THREAD_ATTACH
my_plain_dll_to_call_JNI_DLL: DLL_THREAD_DETACH
my_plain_dll_to_call_JNI_DLL: DLL_PROCESS_DETACH

myJavaProgram: my_plain_dll_to_call_JNI_DLL Loaded!

myJavaProgram: Java Static Method Exit.

myJavaProgram: Entering Main().

my_plain_dll_to_call_JNI_DLL: In call_my_JNI_DLL_method

my_JNI_DLL.dll: In my_JNI_DLL_method

my_JNI_DLL.dll: Entering my_JNI_DLL_CheckEnvironmentVariables()

my_JNI_DLL.dll: Exiting my_JNI_DLL_CheckEnvironmentVariables

my_JNI_DLL.dll: Calling StartExistingNativeCode.

#
# A fatal error has been detected by the Java Runtime …
Run Code Online (Sandbox Code Playgroud)

java dll java-native-interface loadlibrary

16
推荐指数
1
解决办法
2508
查看次数

有没有更好的方法在C++中加载DLL?

现在我做这样的事情,如果我在我的DLL中有很多我想要引用的函数,它看起来很麻烦.是否有更好,更清晰的方式来访问函数,而无需为每个函数定义创建一个typedef,以便它可以正确地编译和加载函数.我的意思是函数定义已经在.h文件中,我不应该在加载函数后重新声明它们(或者我?)是否有比使用LoadLibary更好的解决方案?如果有一种方法可以在Visual Studio 2005项目设置中执行相同的操作,我不一定需要该功能.


BHannan_Test_Class.h

#include "stdafx.h"
#include <windows.h>

#ifndef BHANNAN_TEST_CLASS_H_
#define BHANNAN_TEST_CLASS_H_

extern "C" {

    // Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
    int __declspec (dllexport) Factorial(int n);

    // Returns true iff n is a prime number.
    bool __declspec (dllexport) IsPrime(int n);

}

#endif  // BHANNAN_TEST_CLASS_H_
Run Code Online (Sandbox Code Playgroud)

BHannan_Test_Class.cpp

#include "stdafx.h"
#include "BHannan_Test_Class.h"

// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n) {
  int …
Run Code Online (Sandbox Code Playgroud)

c++ windows dll loadlibrary

10
推荐指数
2
解决办法
2万
查看次数

插件DLL依赖于其他DLL

我正在编写一个DLL来插入另一个(第三方)应用程序.DLL将需要依赖于另一组DLL(出于许可证原因,我无法静态链接).

我希望我的DLL可以"xcopy-deployable"到任何目录.我也不想要求将此目录添加到路径中.

如果我只是以通常的方式构建DLL,Windows将拒绝加载DLL,因为它无法找到当前进程旁边的DLL.

有没有什么好的选项可以帮助Windows找到DLL?


回答一些问题:

  • DLL是用C++编写的.
  • 额外的DLL是QT-dlls.
  • 我想将额外的DLL放在与我的插件DLL相同的文件夹中.我可以从中获取该文件夹的名称GetModuleFileName.
  • 该应用程序是Firefox,DLL是PKCS#11安全模块.
  • 应用程序使用DL​​L的完整路径加载DLL(用户在安装插件时提供它).
  • 要求将DLL放在System32中或应用程序旁边可以工作,但它有点乱,可能会导致卸载程序出现问题.
  • LoadLibraryGetProcAddress当然会工作,但不是在我的情况真的是可行的.我在其他DLL中使用了数百个(如果不是数千个)方法.我真的需要使用import-libraries.

我曾考虑过SetDllDirectory在DllMain中使用延迟加载的dll .有没有人尝试过这样的事情?

c++ windows dll loadlibrary

9
推荐指数
1
解决办法
1214
查看次数

从32位进程调用64位dll上的LoadLibrary

我有一个32位的exe,当它检测到操作系统是64位时需要动态加载64位dll.这可以通过LoadLibrary吗?如果没有,是否有其他方法可以实现相同的目标?

c++ 64-bit x86 loadlibrary

9
推荐指数
2
解决办法
7227
查看次数