我想加载相同的DLL,例如Lib.dll多次!
- >需要为每个LoadLibrary创建一个新进程(CreateProcess函数)!
任何人都有一个例子或一些提示?!
谢谢和问候
我有用C编写的本机源代码,我想在我的Android设备(Nexus 7)上运行.我已经成功地使用Android NDK在Android上运行本机代码进行了大量研究和在线教程.我对此有了一些了解.但是,我所使用的代码利用了complex.h中定义的标准数学库的复杂功能.然而,NDK C库似乎不支持复杂的功能.每当我对项目进行ndk-build时,我得到:
fatal error: complex.h: no such file or directory.
Run Code Online (Sandbox Code Playgroud)
作为一个解决方案,我想从arm-linux-gnueabi获取标准数学库(libm.a)并将其与我的本地源链接.这是我的Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := StandardC
LOCAL_SRC_FILES := libc.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := mathLib
LOCAL_SRC_FILES := libm.a
LOCAL_STATIC_LIBRARIES := StandardC
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := ComplexOperations
LOCAL_SRC_FILES := libComplexOperations.a
LOCAL_STATIC_LIBRARIES := mathLib
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := MySource
LOCAL_CFLAGS += -std=c99
LOCAL_SRC_FILES := com_samuel_test_ComplexOperationsLib.c
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include
LOCAL_STATIC_LIBRARIES := ComplexOperations
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
我不得不链接arm-linux-gnueabi-gcc的libc以及libm需要它.使用arm-linux-gnueabi-gcc和编译器标志-march = armv7-a静态编译"ComplexOperations"模块.该库使用complex.h.这种构建没有任何错误和警告.但是当我运行应用程序并打电话时
System.loadLibrary("MySource");
Run Code Online (Sandbox Code Playgroud)
我在logcat上遇到这个错误: …
我有一个C++ DLL文件,它使用了很多其他c ++库(IPP,Opencv +++),我需要将其加载到matlab中.我怎样才能做到这一点?
我尝试过loadlibrary和mex.加载库不起作用.
mex找到linux的东西(平台独立库)并尝试包含它们.这不起作用.
有没有人有什么好主意?
首先,COM对我来说就像是黑魔法.但我需要在我正在开发的一个项目中使用COM dll.
所以,我有一个我正在开发的DLL,我需要一些单独的COM DLL中可用的功能.当我使用Depends.exe查看COM DLL时,我看到像DllGetClassObject()这样的方法和其他函数,但没有我感兴趣的函数.
我可以访问COM DLL(遗留)源代码,但它很乱,我更喜欢使用二进制中的COM DLL,就像一个大黑盒子,不知道里面发生了什么.
那么,如何使用LoadLibrary从我的代码中调用COM DLL函数?可能吗?如果,是的,你能给我一个如何做的例子吗?
我正在使用Visual Studio 6进行此项目.
非常感谢!
技术摘要:我正在开发部署在GlassFish v3上的Java Web服务,在CentOS 5上运行.
我的Web服务使用本机库(.so)提供的功能.本机库工作正常,但我没有太多运气正确配置环境以加载本机库但不受Web应用程序重新部署的影响,而无需重新启动应用程序服务器.
到目前为止我所做的是:
最初我在Web服务代码中加载了库(静态{System.load(path/to/libabc.so)};),所有路径设置正确,并且工作正常,直到我重新部署应用程序并且它抱怨该库由另一个ClassLoader加载.我发现本机库只加载一次.
为了尝试解决这个问题,我从Web应用程序中删除了库加载代码,创建了一个Singleton类,将其包装到Lifecyle模块中,将其部署到GlassFish共享库文件夹,然后配置GlassFish以在启动时运行包装器.我们的想法是,现在所有的Web应用程序都能够引用它,因为它不依赖于某个特定的Web应用程序,而是由层次结构中较高的ClassLoader加载.
当GlassFish启动时,本机库成功加载(linux> lsof | grep libabc.so).但是,在我的Web服务Java代码中执行本机方法时,Web服务代码失败并出现UnsatisfiedLinkError.在我看来,Web应用程序中的代码无法访问启动时加载的库.
谁能告诉我我做错了什么?
提前致谢.
我遇到了以下奇怪的代码块.想象你有以下typedef:
typedef int (*MyFunctionPointer)(int param_1, int param_2);
Run Code Online (Sandbox Code Playgroud)
然后,在函数中,我们尝试以下列方式从DLL运行函数:
LPCWSTR DllFileName; //Path to the dll stored here
LPCSTR _FunctionName; // (mangled) name of the function I want to test
MyFunctionPointer functionPointer;
HINSTANCE hInstLibrary = LoadLibrary( DllFileName );
FARPROC functionAddress = GetProcAddress( hInstLibrary, _FunctionName );
functionPointer = (MyFunctionPointer) functionAddress;
//The values are arbitrary
int a = 5;
int b = 10;
int result = 0;
result = functionPointer( a, b ); //Possible error?
Run Code Online (Sandbox Code Playgroud)
问题是,没有任何方法可以知道我们使用LoadLibrary获取的地址的功能是否有两个整数参数.dll名称由用户在运行时提供,然后列出导出函数的名称和用户选择要测试的那个(再次,在运行时:S:S).那么,通过在最后一行执行函数调用,我们不是打开可能的堆栈损坏的大门吗?我知道这会编译,但是在我们将错误的参数传递给我们指向的函数的情况下会发生什么样的运行时错误?
HINSTANCE hinstLib=LoadLibrary("C:\\mydll.dll");
我不知道为什么0
在运行那行代码后我总是得到回报.
实际上我还有另一个COM dll,即mydllCOM.dll
我已经用regsvr32
命令成功注册了.我想(mydll.dll)
在我的应用程序中使用上述内容,但总是在提到的行中失败.
我得到的错误代码GetLastError is 193
,我不知道,为什么它是关于错误类型的DLL
我正在研究一种在Windows XP和Windows Vista之间的所有Windows版本上运行的C++软件.在我的代码中,我开发了一个链接标准库(Qt库)的DLL .一旦部署了我的软件,用户在他的系统上没有完全相同的Qt构建,但配置略有不同并不罕见.可能存在禁用的功能(因此它们的Qt构建不会导出相同的符号集),或者甚至可能以使库二进制文件与原始文件不兼容的方式更改库.
在某些时候,我通过LoadLibrary()调用加载我的DLL.这可以吸引用户系统上的任何Qt库.如果我很幸运,他们的Qt构建与我在开发DLL时使用的内容兼容,因此LoadLibrary()成功.但是,根据他们对Qt构建所做的更改,LoadLibrary()调用有时会失败
我的问题是:我怎样才能优雅地捕捉到这些错误?对,我只是使用GetLastError(),然后打印上述两个消息之一.然而,这将是多少,如果我知道更多有用它的模块无法找到,或者它缺少的程序.我注意到,当在资源管理器中运行一个链接缺少DLL的应用程序时,资源管理器设法产生一个很好的'由于缺少所需的库blah.dll而无法加载应用程序foo'.是否有一些API可用于获取有关LoadLibrary()调用失败原因的更多信息?
Microsoft发布安全通报(2269637)不安全的库加载可能允许远程执行代码.
该注释指的是有助于检测此问题的工具和动态链接库安全性的编程指南.
这些指南如何转换为.NET开发?我认为这只影响平台调用.
这仍然是导入系统库的推荐方法吗?
DllImport("user32.dll")]
Run Code Online (Sandbox Code Playgroud) 在 AIX 6.1 ppc64 上,为了加载 libm.a,我们的应用程序使用System.loadLibrary("m")
. 或者它失败并显示错误消息
模块的幻数无效
根据 IBM 文档,当 32 位和 64 位二进制文件不匹配时,就会发生这种情况。或者,无论我们使用 Java6(32 位)还是 Java6_64(64 位)JVM,都会发生这种情况。所以情况并非如此。
另一个可能的原因是/usr/lib/libm.a
不是共享库。但是我们就是libm.a
在平台上找不到共享模式来使用!
根据 Javadoc,在 System.loadLibrary("name") 中,“name”到真实库的映射是系统相关的。在大多数 Unix 系统上,它被映射到 lib.so,而在 AIX 上,它被映射到 lib.a ;请注意,在 AIX 上,.a 可以是混合的,即。它可以包含静态和共享对象,32 位和 64 位对象。我的问题是在 AIX 上找到共享模式 libm.a。
有谁知道如何使用System.loadLibrary("m")
加载一个libm.a
?
PS
System.loadLibrary("m")
在我们测试过的大多数 UNIX 平台上运行良好。