我通常在c#.NET中使用Win32 API.但不要在一个应用程序中声明所有内容.有时通常使用user32,有时gdi32 ...我想当我声明所有api函数时,那些使用了很多内存.在.NET中使用API的最佳方法是什么?
我有机会让我的软件用户从openfile对话框中选择dll.(因此我的用户可以从我的网站下载dll并将其与主项目一起使用).一切都工作正常,甚至可以发现dll是由我提供或选择了一个无效的DLL.但如果用户选择重命名的文件(例如:apple.txt文件重命名为apple.dll),问题就会引发.我输入了这样的代码
尝试dllHandle:= LoadLibrary(pwidechar(openfiledialog1.filename));
catch {showmessage如果它不是一个dll(但它可以是任何dll,它会检查这是我的dll或第三方之后)}}
结束;
delphi显示的错误信息是"选择了错误的库图像"
但是如果用户选择了无效的dll,它会显示自己的错误消息并且被攻击,那么尝试catch是行不通的.
任何人都可以帮助我,我正在使用delphi 2009
我刚刚尝试了以下代码(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,错误模态未找到).
我该如何纠正这个问题?
谢谢!
有可能模仿这个loadlibrary功能吗?我想从BLOB字段加载一个库而不先将其写入临时文件,我需要一个不依赖于特定版本的delphi编译器或Windows的解决方案,并且不会触发防病毒软件.
我无法生成背景被删除的图像
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”时
我的场景如下:我的应用程序依赖于某个DLL(我在链接时使用它的lib).但是,当我的应用程序执行时,我想使用LoadLibrary显式加载该DLL.但是,默认情况下,当代码到达需要该DLL的范围时,环境会自动查找,然后加载它.我想要禁用此行为,并且对于我所关心的所有内容,如果应用程序达到了它想要执行属于该DLL的代码的程度,我更喜欢它会崩溃而不是自动加载它(因此DLL将只加载因为我明确地调用了LoadLibrary).
同时,我正在使用延迟加载能力(因此只有在实际需要加载DLL时才会发生加载触发).但是,如果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?也许一个清单或什么?这是我正在寻找的那种"魔术子弹".我知道我可以:
感谢您的指导,尤其是"其他".我知道这个问题不一定是Delphi特有的.谢谢!
它不能调用LoadLibrary或LoadLibraryEx函数(或调用这些函数的函数),因为这可能会在DLL加载顺序中创建依赖循环.这可能导致在系统执行其初始化代码之前使用DLL.
我试图LoadLibrary从DllMain 打来电话,什么也没发生.
我看到的唯一问题是加载的DLL将在我的DllMain执行的其余部分之前使用我的DLL中的函数.
为什么我不能在DllMain中调用LoadLibrary?
好吧,我意识到我不能在DllMain中调用LoadLibrary只是因为我必须像其他信徒一样相信 MSDN(我在那里看到了一些错误的东西,但我也应该忘记它们).
并且因为在较新版本的Windows中可能会发生某些事情(尽管过去十年没有任何变化).
但是,任何人都可以显示一个代码,它会重现在LoadLibraryDllMain中调用时发生的事情吗?在任何现有的Windows操作系统?
不只是在另一个内部调用一个单例初始化函数,而是LoadLibrary在DllMain中?
我试图为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定位)是:
这是我的问题:给定依赖者walker说:"你有除qt之外的所有dll"并且我确信我有qt dll,还有什么其他原因可以使LoadLibrary失败并使用ERROR_MOD_NOT_FOUND?
使用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) loadlibrary ×10
dll ×5
delphi ×4
winapi ×3
c++ ×2
windows ×2
api ×1
c# ×1
delay-load ×1
delphi-2009 ×1
dllimport ×1
interface ×1
onnx ×1
path ×1
python ×1
qt ×1
rembg ×1
tensorrt ×1
try-catch ×1
visual-c++ ×1