LoadLibrary加载dll 返回NULL,GetLastError=126

cokomowang 2016-02-15 11:36:18
大家新年好- -刚刚过完年又要开始调程序码代码了

如题,但是情况有点复杂

两个不同的工程,工程a和工程b,我自己在工程c中写了一个c.dll来给工程a和b调用,c.dll还依赖另外两个dll,一共三个dll都全部放到了两个工程的exe目录下

但是,在工程a中调用c.dll的函数成功;而在工程b中则无法成功加载,GetLastError=126。
可以肯定工程b的dll路径是绝对没有问题的,原因是我另外写了一个测试用的,不依赖任何其他dll 的一个dll(其中的函数只有return语句),在a和b中都被成功调用

我觉得问题还是出在c.dll缺少依赖上,但是不明白为何两个工程一个可以另一个不行,求解答啊TT

dependency walker打开c.dll的部分缺失项如下:

API-MS-WIN-CORE-APIQUERY-L1-1-0.DLL
API-MS-WIN-CORE-APPCOMPAT-L1-1-1.DLL
API-MS-WIN-CORE-APPINIT-L1-1-0.DLL
API-MS-WIN-CORE-ATOMS-L1-1-0.DLL
API-MS-WIN-CORE-COM-L1-1-0
API-MS-WIN-CORE-COM-L1-1-1.DLL
API-MS-WIN-CORE-COM-MIDLPROXYSTUB-L1-1-0.DLL
API-MS-WIN-CORE-COM-PRIVATE-L1-1-0.DLL
API-MS-WIN-CORE-COM-PRIVATE-L1-1-1.DLL
API-MS-WIN-CORE-COMM-L1-1-0.DLL
API-MS-WIN-CORE-CONSOLE-L1-1-0.DLL
API-MS-WIN-CORE-CONSOLE-L2-1-0.DLL
API-MS-WIN-CORE-CRT-L1-1-0.DLL
API-MS-WIN-CORE-CRT-L2-1-0.DLL
API-MS-WIN-CORE-DATETIME-L1-1-1.DLL
API-MS-WIN-CORE-DATETIME-L1-1-2.DLL
API-MS-WIN-CORE-DEBUG-L1-1-1.DLL
API-MS-WIN-CORE-DELAYLOAD-L1-1-1.DLL
API-MS-WIN-CORE-ENCLAVE-L1-1-0.DLL
API-MS-WIN-CORE-ERRORHANDLING-L1-1-1.DLL
API-MS-WIN-CORE-ERRORHANDLING-L1-1-3.DLL
API-MS-WIN-CORE-FIBERS-L1-1-1.DLL
API-MS-WIN-CORE-FIBERS-L2-1-1.DLL
API-MS-WIN-CORE-FILE-L1-2-1.DLL
API-MS-WIN-CORE-FILE-L1-2-2.DLL
API-MS-WIN-CORE-FILE-L2-1-1.DLL
API-MS-WIN-CORE-FILE-L2-1-2.DLL
API-MS-WIN-CORE-HANDLE-L1-1-0.DLL
API-MS-WIN-CORE-HEAP-L1-2-0.DLL
API-MS-WIN-CORE-HEAP-L2-1-0.DLL
API-MS-WIN-CORE-HEAP-OBSOLETE-L1-1-0.DLL
API-MS-WIN-CORE-INTERLOCKED-L1-2-0.DLL
API-MS-WIN-CORE-IO-L1-1-1.DLL
API-MS-WIN-CORE-JOB-L1-1-0.DLL
API-MS-WIN-CORE-JOB-L2-1-0.DLL
API-MS-WIN-CORE-KERNEL32-LEGACY-L1-1-1.DLL
API-MS-WIN-CORE-KERNEL32-LEGACY-L1-1-4.DLL
API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL
API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-2.DLL
API-MS-WIN-CORE-LIBRARYLOADER-L1-2-0.DLL
API-MS-WIN-CORE-LIBRARYLOADER-L1-2-1.DLL
API-MS-WIN-CORE-LIBRARYLOADER-L2-1-0.DLL
API-MS-WIN-CORE-LOCALIZATION-L1-2-1.DLL
API-MS-WIN-CORE-LOCALIZATION-L1-2-2.DLL
API-MS-WIN-CORE-LOCALIZATION-L2-1-0.DLL
API-MS-WIN-CORE-LOCALIZATION-OBSOLETE-L1-3-0.DLL
API-MS-WIN-CORE-LOCALIZATION-PRIVATE-L1-1-0.DLL
API-MS-WIN-CORE-MEMORY-L1-1-2.DLL
API-MS-WIN-CORE-NAMEDPIPE-L1-2-0.DLL
API-MS-WIN-CORE-NAMEDPIPE-L1-2-2.DLL
API-MS-WIN-CORE-NAMESPACE-L1-1-0.DLL
API-MS-WIN-CORE-NORMALIZATION-L1-1-0.DLL
API-MS-WIN-CORE-PATH-L1-1-0.DLL
API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL
API-MS-WIN-CORE-PROCESSENVIRONMENT-L1-2-0.DLL
API-MS-WIN-CORE-PROCESSSNAPSHOT-L1-1-0.DLL
API-MS-WIN-CORE-PROCESSTHREADS-L1-1-1
API-MS-WIN-CORE-PROCESSTHREADS-L1-1-2.DLL
API-MS-WIN-CORE-PROCESSTHREADS-L1-1-3.DLL
API-MS-WIN-CORE-PROCESSTOPOLOGY-L1-2-0.DLL
API-MS-WIN-CORE-PROFILE-L1-1-0.DLL
API-MS-WIN-CORE-PSAPI-ANSI-L1-1-0.DLL
API-MS-WIN-CORE-PSAPI-L1-1-0.DLL
API-MS-WIN-CORE-PSM-KEY-L1-1-0.DLL
API-MS-WIN-CORE-QUIRKS-L1-1-0.DLL
API-MS-WIN-CORE-REALTIME-L1-1-0.DLL
API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL
API-MS-WIN-CORE-REGISTRY-L1-1-1.DLL
API-MS-WIN-CORE-REGISTRYUSERSPECIFIC-L1-1-0.DLL
API-MS-WIN-CORE-RTLSUPPORT-L1-2-0.DLL
API-MS-WIN-CORE-SHLWAPI-LEGACY-L1-1-0.DLL
API-MS-WIN-CORE-SHLWAPI-OBSOLETE-L1-2-0.DLL
API-MS-WIN-CORE-SIDEBYSIDE-L1-1-0.DLL
API-MS-WIN-CORE-STRING-L1-1-0.DLL
API-MS-WIN-CORE-STRING-L2-1-0.DLL
API-MS-WIN-CORE-STRING-L2-1-1.DLL
API-MS-WIN-CORE-STRING-OBSOLETE-L1-1-0.DLL
API-MS-WIN-CORE-STRINGANSI-L1-1-0.DLL
API-MS-WIN-CORE-SYNCH-L1-1-0.DLL
API-MS-WIN-CORE-SYNCH-L1-2-0.DLL
API-MS-WIN-CORE-SYNCH-L1-2-1.DLL
API-MS-WIN-CORE-SYSINFO-L1-2-1.DLL
API-MS-WIN-CORE-SYSINFO-L1-2-3.DLL
API-MS-WIN-CORE-SYSTEMTOPOLOGY-L1-1-0.DLL
API-MS-WIN-CORE-THREADPOOL-L1-2-0.DLL
API-MS-WIN-CORE-THREADPOOL-LEGACY-L1-1-0.DLL
API-MS-WIN-CORE-THREADPOOL-PRIVATE-L1-1-0.DLL
API-MS-WIN-CORE-TIMEZONE-L1-1-0.DLL
API-MS-WIN-CORE-URL-L1-1-0.DLL
API-MS-WIN-CORE-UTIL-L1-1-0.DLL
API-MS-WIN-CORE-VERSION-L1-1-0.DLL
API-MS-WIN-CORE-VERSION-L1-1-1.DLL
API-MS-WIN-CORE-VERSION-PRIVATE-L1-1-0.DLL
API-MS-WIN-CORE-VERSIONANSI-L1-1-0.DLL
API-MS-WIN-CORE-VERSIONANSI-L1-1-1.DLL
API-MS-WIN-CORE-WINDOWSERRORREPORTING-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERROR-L1-1-1.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
API-MS-WIN-CORE-WOW64-L1-1-0.DLL
API-MS-WIN-CORE-WOW64-L1-1-1.DLL
API-MS-WIN-CORE-XSTATE-L2-1-0.DLL
API-MS-WIN-DEVICES-CONFIG-L1-1-1.DLL
API-MS-WIN-EVENTING-CLASSICPROVIDER-L1-1-0.DLL
API-MS-WIN-EVENTING-PROVIDER-L1-1-0.DLL
API-MS-WIN-MM-JOYSTICK-L1-1-0.DLL
API-MS-WIN-MM-MISC-L1-1-1.DLL
API-MS-WIN-MM-MME-L1-1-0.DLL
API-MS-WIN-MM-TIME-L1-1-0.DLL
API-MS-WIN-SECURITY-APPCONTAINER-L1-1-0.DLL
API-MS-WIN-SECURITY-BASE-L1-2-0.DLL
API-MS-WIN-SECURITY-LSALOOKUP-L1-1-1.DLL
API-MS-WIN-SECURITY-LSAPOLICY-L1-1-0.DLL
API-MS-WIN-SECURITY-SDDL-L1-1-0.DLL
API-MS-WIN-SERVICE-MANAGEMENT-L1-1-0.DLL
API-MS-WIN-SERVICE-WINSVC-L1-2-0.DLL
API-MS-WIN-SHELL-SHELLCOM-L1-1-0.DLL
API-MS-WIN-SHELL-SHELLFOLDERS-L1-1-0.DLL
API-MS-WIN-STORAGE-EXPORTS-EXTERNAL-L1-1-0.DLL
API-MS-WIN-STORAGE-EXPORTS-INTERNAL-L1-1-0.DLL
SDL2_MIXER.DLL
API-MS-WIN-APPMODEL-IDENTITY-L1-2-0.DLL
API-MS-WIN-APPMODEL-RUNTIME-INTERNAL-L1-1-0.DLL
API-MS-WIN-APPMODEL-RUNTIME-L1-1-0.DLL
API-MS-WIN-APPMODEL-RUNTIME-L1-1-1.DLL
API-MS-WIN-APPMODEL-STATE-L1-2-0.DLL
API-MS-WIN-APPMODEL-UNLOCK-L1-1-0.DLL
API-MS-WIN-BASE-UTIL-L1-1-0.DLL
API-MS-WIN-CORE-CALENDAR-L1-1-0.DLL
API-MS-WIN-CORE-COM-L2-1-1.DLL
API-MS-WIN-CORE-DEBUG-L1-1-0.DLL
API-MS-WIN-CORE-DELAYLOAD-L1-1-0.DLL
API-MS-WIN-CORE-ERRORHANDLING-L1-1-0.DLL
API-MS-WIN-CORE-FIBERS-L1-1-0.DLL
API-MS-WIN-CORE-FILE-L1-1-0.DLL
API-MS-WIN-CORE-FILE-L1-2-0.DLL
API-MS-WIN-CORE-FILE-L2-1-0.DLL
API-MS-WIN-CORE-HEAP-L1-1-0.DLL
API-MS-WIN-CORE-INTERLOCKED-L1-1-0.DLL
API-MS-WIN-CORE-IO-L1-1-0.DLL
API-MS-WIN-CORE-KERNEL32-LEGACY-L1-1-0.DLL
API-MS-WIN-CORE-LIBRARYLOADER-L1-1-0.DLL
API-MS-WIN-CORE-LOCALIZATION-L1-1-0.DLL
API-MS-WIN-CORE-LOCALIZATION-L1-2-0.DLL
API-MS-WIN-CORE-LOCALIZATION-OBSOLETE-L1-2-0.DLL
API-MS-WIN-CORE-LOCALREGISTRY-L1-1-0.DLL
API-MS-WIN-CORE-MARSHAL-L1-1-0.DLL
API-MS-WIN-CORE-MEMORY-L1-1-0.DLL
API-MS-WIN-CORE-MISC-L1-1-0.DLL
API-MS-WIN-CORE-PERFCOUNTERS-L1-1-0.DLL
API-MS-WIN-CORE-PROCESSENVIRONMENT-L1-1-0.DLL
API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL
API-MS-WIN-CORE-PROCESSTHREADS-L1-1-1.DLL
API-MS-WIN-CORE-PROCESSTOPOLOGY-OBSOLETE-L1-1-0.DLL
API-MS-WIN-CORE-PSM-APPNOTIFY-L1-1-0.DLL
API-MS-WIN-CORE-REALTIME-L1-1-1.DLL
API-MS-WIN-CORE-REGISTRY-L2-2-0.DLL
API-MS-WIN-CORE-REGISTRY-PRIVATE-L1-1-0.DLL
API-MS-WIN-CORE-RTLSUPPORT-L1-1-0.DLL
API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL
API-MS-WIN-CORE-SYSINFO-L1-1-0.DLL
API-MS-WIN-CORE-SYSINFO-L1-2-0.DLL
API-MS-WIN-CORE-TOOLHELP-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERRORPRIVATE-L1-1-1.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-PROPERTYSETPRIVATE-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-PROPERTYSETPRIVATE-L1-1-1.DLL
API-MS-WIN-CORE-WINRT-REGISTRATION-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-COREUI-SECRUNTIME-L1-1-0.DLL
API-MS-WIN-CRT-LOCALE-L1-1-0.DLL
API-MS-WIN-CRT-PRIVATE-L1-1-0.DLL
API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL
API-MS-WIN-CRT-STRING-L1-1-0.DLL
API-MS-WIN-CRT-TIME-L1-1-0.DLL
API-MS-WIN-DEVICES-QUERY-L1-1-1.DLL
API-MS-WIN-DOWNLEVEL-ADVAPI32-L1-1-0.DLL
API-MS-WIN-DOWNLEVEL-ADVAPI32-L2-1-0.DLL
API-MS-WIN-DOWNLEVEL-KERNEL32-L2-1-0.DLL
API-MS-WIN-DOWNLEVEL-NORMALIZ-L1-1-0.DLL
API-MS-WIN-DOWNLEVEL-OLE32-L1-1-0.DLL
API-MS-WIN-DOWNLEVEL-SHELL32-L1-1-0.DLL
API-MS-WIN-DOWNLEVEL-SHLWAPI-L1-1-0.DLL
API-MS-WIN-DOWNLEVEL-SHLWAPI-L2-1-0.DLL
。。。。。。。。。


a.cpp

#include <stdio.h>
#include <Windows.h>
#include <tchar.h>

int main()
{
HMODULE hModule = NULL;
typedef int(*Func)();

hModule = LoadLibrary(_TEXT("..\\x64\\Release\\nMidiPlayer.dll"));
DWORD dw = GetLastError();
printf("%d\n", dw);

if (hModule){

Func fAdd = (Func)GetProcAddress(hModule, "MidiPlayerInit");
Func fAdd2 = (Func)GetProcAddress(hModule, "MidiPlayerRun");

printf("%d\n", fAdd());

printf("%d\n", fAdd2());
}
else{
printf("%d\n", -1);
}

system("pause");

return 0;
}


b.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "ppp.h"
#include "MyActor.h"
#include <stdio.h>
#include <Windows.h>
#include <tchar.h>


// Sets default values
AMyActor::AMyActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;

}

void AMyActor::test()
{


}

void AMyActor::MidiPlayerInit()
{
HMODULE hModule = NULL;
typedef int(*Func)();

hModule = LoadLibrary(_TEXT("..\\..\\Plugins\\MyDLL\\nMidiPlayer.dll"));

int32 dw = GetLastError();
UE_LOG(LogTemp, Warning, TEXT("GetLastError info = %d"), dw);

Func fAdd = (Func)GetProcAddress(hModule, "MidiPlayerInit");
return;
}

void AMyActor::MidiPlayerRun()
{
HMODULE hModule = NULL;
typedef int(*Func)();

hModule = LoadLibrary(_TEXT("..\\..\\Plugins\\MyDLL\\nMidiPlayer.dll"));

int32 dw = GetLastError();
UE_LOG(LogTemp, Warning, TEXT("GetLastError info = %d"), dw);

Func fAdd = (Func)GetProcAddress(hModule, "MidiPlayerRun");
return;
}

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();

}

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);

}
...全文
2038 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-02-19
  • 打赏
  • 举报
回复
搜“dll hell”
cokomowang 2016-02-19
  • 打赏
  • 举报
回复
可还是有个问题,我的工程a在没加入缺失的那一部分dll 的情况下,仍然自始至终可以调用成功,然而工程b却非得加入那一部分dll才可以。。。并不是很明白- -
如图这是a,b的两个目录


我怀疑可能是包含和库路径相关的问题???
这是a,b的两个路径设置,但是他们的包含路径和库路径都是未修改的
其中b 工程是UE4定制的,只有这一页是路径设置

a的



b的



cokomowang 2016-02-19
  • 打赏
  • 举报
回复
引用 5 楼 zhoujielunzhimi 的回复:
模块路径错误。 通过VS运行和直接双击exe运行时,程序当前目录不一样,那么,你的c.dll的相对路径也不一样。 先试试绝对路径,看看是否成功?
引用 6 楼 CharlesSimonyi 的回复:
建议全部改成绝对路径进行一次测试以排除路径问题,相对路径容易受CurrentDirectory影响,如楼上所说,通过VS运行和直接双击exe运行时,由于CurrentDirectory的不同,像..\\..\\Plugins\\MyDLL\\nMidiPlayer.dll这样的相对路径意义是不同的,被调用的DLL的CurrentDirectory也会受宿主进程的影响而改变。
使用绝对路径后,通过vs运行和直接双击exe运行结果不一样的问题解决了,都调用dll 成功。这个问题就是相对路径引起的。 不过还有另一个问题没解决——工程b 中调用dll还是不成功,我再次排查依赖项的问题,最终解决。方法是将所引用的dll的所有配套的其他dll一起放入exe目录。工程b中调用成功。
赵4老师 2016-02-16
  • 打赏
  • 举报
回复
将除系统dll外的其它dll全部放在和exe相同目录下。
encoderlee 版主 2016-02-16
  • 打赏
  • 举报
回复
建议全部改成绝对路径进行一次测试以排除路径问题,相对路径容易受CurrentDirectory影响,如楼上所说,通过VS运行和直接双击exe运行时,由于CurrentDirectory的不同,像..\\..\\Plugins\\MyDLL\\nMidiPlayer.dll这样的相对路径意义是不同的,被调用的DLL的CurrentDirectory也会受宿主进程的影响而改变。
sumos 2016-02-16
  • 打赏
  • 举报
回复
模块路径错误。 通过VS运行和直接双击exe运行时,程序当前目录不一样,那么,你的c.dll的相对路径也不一样。 先试试绝对路径,看看是否成功?
fefe82 2016-02-15
  • 打赏
  • 举报
回复
在使用 GetLastError 之前,必须先确认真的有错误发生了。 对 LoadLibrary ,只有返回的 hModule 为 NULL 的时候,GetLastError 才有意义。 不检查 hModule 而直接检查 GetLastError 是没有意义的。
cokomowang 2016-02-15
  • 打赏
  • 举报
回复
UE_LOG是一个输出语句。。。。 可以忽略
幻夢之葉 2016-02-15
  • 打赏
  • 举报
回复
你两个不同路径的dll版本是否相同?debug就调用debug版本,release就调用release版本,32位64位要区别开来 还有该dll依赖的其他dll你是否也放置在\\Plugins\\MyDLL\\ 之下? 你测试是不是依赖项的问题,你可以在B工程中把路径修改为你A中的路径尝试下(注意exe跟dll编译版本要一致,调用的dll使用绝对路径以防止测试的时候路径错误)
cokomowang 2016-02-15
  • 打赏
  • 举报
回复
引用 2 楼 fefe82 的回复:
在使用 GetLastError 之前,必须先确认真的有错误发生了。 对 LoadLibrary ,只有返回的 hModule 为 NULL 的时候,GetLastError 才有意义。 不检查 hModule 而直接检查 GetLastError 是没有意义的。
其实原来代码就是你说的这样的= =只不过有些用于追踪的输出语句,为了让大家看着顺眼就删了但是没注意删多了。应该不是这个问题

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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