我们可以使用“LoadLibrary”让我们的应用程序用Visual Studio 2010和静态运行时编译吗?
Can we use `LoadLibrary ` having our application compiled with Visual Studio 2010 and static runtime?
我想要的很简单-有c++应用程序,将与静态运行时 (/MT
, /MTd
标志)编译,并能够打开,调用等类和dll函数(使用LoadLibrary, c++)。这种事可能吗?
这不是不可能的。但要使其通用且可靠是一个非常遥远的目标。c++中没有标准化的元数据格式来让您知道正在传递正确的参数。甚至导出的类或函数的名称也不容易猜测,它是编译器实现的细节。
COM自动化就是解决这些问题的一个例子。由ActiveX测试容器覆盖。或者Java或。net托管语言中的反射支持。而不是c++。
我想你把事情搞混了。只是因为它被称为"静态"运行时,它只是意味着标准C和c++库的代码被静态地链接到您的应用程序中。一般来说,这不会对应用程序的功能造成任何限制。
所有的标准库类,如ifstream
和函数,如printf
将是可用的,无论他们的代码是在静态运行时的EXE内部,还是在动态运行时的EXE外部。所有的Win32函数,如LoadLibrary
和GetProcAddress
,总是在你的应用程序之外的常规Windows dll(如Kernel32.dll
)中,所以它们当然不会受到你的运行时选择的影响。
我想说你真正的问题是试图使用GetProcAddress
调用c++方法。Win32 API仅用于动态调用C函数。您将遇到的第一个问题是,由于c++的名称混淆,您将无法找到方法的名称。您还可能在分配对象时遇到问题。我的直觉告诉我,要使它正常工作几乎是不可能的。
这里有三个建议的替代方案,可以使用GetProcAddress
代替直接调用c++方法:
- 将c++方法封装在C函数中。
- 使用c++框架,如COM或Qt插件来设置动态DLL接口。
- 使用不同的平台,如。net或Java;完全支持面向对象反射和动态调用。
相关文章:
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 我们可以访问一个不存在的联盟的成员吗
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 我们可以删除链表中静态内存中的节点吗
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 当我们为(;;) 写作时,它做了什么?for 循环中的双分号有什么作用?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 我们可以将数据永久保存为数据结构吗?
- 为什么我们将单个或多维数组的大小声明为常量值?
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- 为什么当我们有常量引用时创建临时对象?
- 为什么我们再次从结构对象创建结构变量?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- 我们是否需要为 C++ 中的多个函数初始化多个模板?
- 我们可以使用“LoadLibrary”让我们的应用程序用Visual Studio 2010和静态运行时编译吗?