标签: loadlibrary

DllImport vs LoadLibrary,最好的方法是什么?

我通常在c#.NET中使用Win32 API.但不要在一个应用程序中声明所有内容.有时通常使用user32,有时gdi32 ...我想当我声明所有api函数时,那些使用了很多内存.在.NET中使用API​​的最佳方法是什么?

c# winapi dllimport loadlibrary

3
推荐指数
2
解决办法
9871
查看次数

Delphi loadlibrary()中的错误

我有机会让我的软件用户从openfile对话框中选择dll.(因此我的用户可以从我的网站下载dll并将其与主项目一起使用).一切都工作正常,甚至可以发现dll是由我提供或选择了一个无效的DLL.但如果用户选择重命名的文件(例如:apple.txt文件重命名为apple.dll),问题就会引发.我输入了这样的代码

尝试dllHandle:= LoadLibrary(pwidechar(openfiledialog1.filename));

catch {showmessage如果它不是一个dll(但它可以是任何dll,它会检查这是我的dll或第三方之后)}}

结束;

delphi显示的错误信息是"选择了错误的库图像"

但是如果用户选择了无效的dll,它会显示自己的错误消息并且被攻击,那么尝试catch是行不通的.

任何人都可以帮助我,我正在使用delphi 2009

delphi try-catch loadlibrary delphi-2009

3
推荐指数
1
解决办法
3333
查看次数

LoadLibrary返回Null

我刚刚尝试了以下代码(windows xp sp3,vs2010),LoadLibrary似乎正在返回Null.

#include "windows.h"
#include "stdio.h"

int main() {
    HMODULE hNtdll;
    hNtdll = LoadLibrary(LPCWSTR("ntdll.dll"));
    printf("%08x\n", hNtdll);
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是00000000.根据文档,函数失败时返回NULL.我尝试使用GetLastError,错误代码是126(0x7e,错误模态未找到).

我该如何纠正这个问题?

谢谢!

c++ loadlibrary visual-studio-2010 visual-c++

3
推荐指数
1
解决办法
8635
查看次数

如何在delphi中直接从内存中执行代码?

有可能模仿这个loadlibrary功能吗?我想从BLOB字段加载一个库而不先将其写入临时文件,我需要一个不依赖于特定版本的delphi编译器或Windows的解决方案,并且不会触发防病毒软件.

windows delphi api loadlibrary

3
推荐指数
2
解决办法
1858
查看次数

rembg 抛出运行时错误:LoadLibrary 失败:onnxruntime_providers_tensorrt.dll

我无法生成背景被删除的图像

from rembg import remove
from PIL import Image

input_path = "crop.jpeg"
output_path = 'crop1.png'

input = Image.open(input_path)
output = remove(input)
output.save(output_path)
Run Code Online (Sandbox Code Playgroud)

我的错误为: RuntimeError: D:\a_work\1\s\onnxruntime\core\session\provider_bridge_ort.cc:1069 onnxruntime::ProviderLibrary::Get [ONNXRuntimeError] : 1 : FAIL : LoadLibrary 失败,错误 126 ""当尝试加载“C:\users\lib\site-packages\onnxruntime\capi\onnxruntime_providers_tensorrt.dll”时

python loadlibrary tensorrt onnx rembg

3
推荐指数
1
解决办法
3388
查看次数

在C++中禁用自动DLL加载

我的场景如下:我的应用程序依赖于某个DLL(我在链接时使用它的lib).但是,当我的应用程序执行时,我想使用LoadLibrary显式加载该DLL.但是,默认情况下,当代码到达需要该DLL的范围时,环境会自动查找,然后加载它.我想要禁用此行为,并且对于我所关心的所有内容,如果应用程序达到了它想要执行属于该DLL的代码的程度,我更喜欢它会崩溃而不是自动加载它(因此DLL将只加载因为我明确地调用了LoadLibrary).
同时,我正在使用延迟加载能力(因此只有在实际需要加载DLL时才会发生加载触发).但是,如果DLL尚未加载,我希望应用程序崩溃.

也许是否有人熟悉实现这一目标的方法?

c++ dll loadlibrary dynamic-loading delay-load

2
推荐指数
1
解决办法
2489
查看次数

Delphi LoadLibrary无法找到DLL其他目录 - 有什么好的选择吗?

两个Delphi程序需要加载foo.dll,其中包含一些将客户端身份验证证书注入SOAP请求的代码.foo.dll位于c:\ fooapp\foo.dll中,通常由c:\ fooapp\foo.exe加载.这很好.另一个程序需要相同的功能,但它位于c:\ program files\unwantedstepchild\sadapp.exe中.两个aps都使用以下代码加载DLL:

FOOLib := LoadLibrary('foo.dll'); 
...
If FOOLib <> 0 then 
begin
  FOOProc := GetProcAddress(FOOLib , 'xInjectCert');
  FOOProc(myHttpRequest, Data, CertName);
end;
Run Code Online (Sandbox Code Playgroud)

它适用于foo.exe,因为dll就在那里.sadapp.exe无法加载库,因此FOOLib为0,其余的永远不会被调用.因此,sadapp.exe程序默默无法注入证书,当我们对生产进行测试时,证书缺失,连接失败.显然,我们应该完全限定DLL的路径.在没有详细介绍的情况下,测试的某些方面直到最近都掩盖了这个问题,现在修复代码基本上已经太晚了,因为这需要完整的回归测试,而且没有时间.

既然我们把自己画成了一个角落,我需要知道是否有任何我忽略的选择.虽然我们无法更改代码(对于此版本),但我们可以调整安装程序.我发现将c:\ fooapp放入路径可以正常工作.将foo.dll的第二个副本直接添加到c:\ program files\unwantedstepchild中也是如此.c:\ fooapp\foo.exe将在sadapp.exe运行时一直运行,所以我希望Windows能够找到它,但显然不是.有没有办法告诉Windows我真的想要相同的DLL?也许一个清单或什么?这是我正在寻找的那种"魔术子弹".我知道我可以:

  1. 修改Windows路径,可能在安装程序中.那很难看.
  2. 将DLL的第二个副本直接添加到unwantedstepschild文件夹中.也很难看
  3. 在我们编码和测试正确的修复时延迟项目.不能接受的.
  4. 其他?

感谢您的指导,尤其是"其他".我知道这个问题不一定是Delphi特有的.谢谢!

delphi dll path loadlibrary

2
推荐指数
1
解决办法
7643
查看次数

从DllMain调用LoadLibrary

MSDN说:

它不能调用LoadLibrary或LoadLibraryEx函数(或调用这些函数的函数),因为这可能会在DLL加载顺序中创建依赖循环.这可能导致在系统执行其初始化代码之前使用DLL.

我试图LoadLibrary从DllMain 打来电话,什么也没发生.

我看到的唯一问题是加载的DLL将在我的DllMain执行的其余部分之前使用我的DLL中的函数.

为什么我不能在DllMain中调用LoadLibrary?

编辑:

好吧,我意识到我不能在DllMain中调用LoadLibrary只是因为我必须像其他信徒一样相信 MSDN(我在那里看到了一些错误的东西,但我也应该忘记它们).
并且因为在较新版本的Windows中可能会发生某些事情(尽管过去十年没有任何变化).

但是,任何人都可以显示一个代码,它会重现在LoadLibraryDllMain中调用时发生的事情吗?在任何现有的Windows操作系统?
不只是在另一个内部调用一个单例初始化函数,而是LoadLibrary在DllMain中?

language-agnostic windows dll winapi loadlibrary

2
推荐指数
3
解决办法
9337
查看次数

LoadLibrary失败,依赖walker没有帮助

我试图为QtSql使用QOCI插件,直到我遇到一些问题: 为什么QOCI插件无法正常工作

然而事实证明它是一个库加载问题(至少我是这么认为),所以我决定改变问题的主题,因为它是一个新问题.

我有一个DLL文件(称为qsqloci4.dll)当我尝试使用LoadLibrary加载它时,它失败并且GetLastError返回ERROR_MOD_NOT_FOUND.当我尝试使用LoadLibraryEx加载它并且第三个参数是DONT_RESOLVE_DLL_REFERENCES时,它成功加载(不返回NULL).

所以,我认为这是一个依赖问题.我用依赖walker打开了dll文件,有2个文件无法找到:QtCore4.dll和QtSql4.dll.但是,这些文件位于应用程序的工作目录中,并且成功加载了依赖于这些dll的其他dll文件(例如qsqlpsql4.dll).

其他dll(由依赖walker定位)是:

  • oci.dll:与QtCore4.dll和QtSql4.dll位于同一文件夹中,表示我的应用可以访问它
  • kernel32.dll:我相信我的应用程序找到最简单的DLL
  • msvscr80.dll:使用它的其他dll文件可以成功加载.

这是我的问题:给定依赖者walker说:"你有除qt之外的所有dll"并且我确信我有qt dll,还有什么其他原因可以使LoadLibrary失败并使用ERROR_MOD_NOT_FOUND?

dll winapi qt loadlibrary dependency-walker

2
推荐指数
1
解决办法
2077
查看次数

来自DLL的Delphi接口

使用Delphi XE.

当尝试从DLL访问Delphi接口对象时,如果我尝试动态地而不是静态地执行它,则会失败.

dll中的接口单元实现了一个返回接口实例的函数.静态链接时,进入函数时结果为零,一切正常.当动态加载时,结果是非零的,所以当完成对结果的赋值时,IntFCopy代码将其视为非零,因此在赋值之前尝试释放它,这会引发异常.

任何见解将不胜感激.

DLL包括testinterfaceload_u并导出testInt:

library testinterfaceload;

uses
  SimpleShareMem,
  SysUtils,
  Classes,
  testinterfaceload_u in 'testinterfaceload_u.pas';

{$R *.res}
exports testInt;

begin
end.
Run Code Online (Sandbox Code Playgroud)

testinterfaceload_u是定义接口和简单类实现的单元:

unit testinterfaceload_u;

interface

type ITestInt = interface
 procedure Test;
end;

{this function returns an instance of the interface}
function testInt : ITestInt; stdcall; export;

type

TTestInt = class(TInterfacedObject,ITestInt)
 procedure Test;
end;



implementation

function testInt : ITestInt;
begin
//debugger shows result as non-nil ITestInt even before this assignment, when dynamic
  result := TTestInt.Create;  
end;

procedure TTestInt.Test;
var
  i : …
Run Code Online (Sandbox Code Playgroud)

delphi dll interface loadlibrary

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