我们可以使用我的应用程序使用Visual Studio 2010和静态运行时编译的`LoadLibrary`吗?

时间:2011-09-25 17:53:11

标签: c++ visual-studio visual-studio-2010 static runtime

我想要的很简单 - 让C ++应用程序使用静态运行时/MT/MTd标志进行编译)并能够打开,调用等和来自DLL的函数(使用 LoadLibrary ,C ++)。这样的事情可能吗?

2 个答案:

答案 0 :(得分:1)

这不是不可能的。但是让它成为通用的,并且可靠是一个非常长距离拍摄。 C ++中没有标准化的元数据格式,可以让您知道传递的是正确的参数。即使是导出的类或函数的名称也不容易猜到,它是一个编译器实现细节。

COM Automation将是解决这些问题的一个例子。由ActiveX测试容器覆盖。或Java或.Net托管语言等语言的反射支持。不是C ++。

答案 1 :(得分:1)

我认为你在混淆。仅仅因为它被称为“静态”运行时,它只意味着标准C和C ++库的代码静态链接到您的应用程序中。一般来说,这绝不会对您的应用程序可以做什么施加任何限制。

所有标准库类(如ifstream)和printf等函数都可以使用,无论它们的代码是在静态运行时的EXE中,还是在动态运行时的EXE之外。所有Win32函数(如LoadLibraryGetProcAddress)在常规Windows DLL(如Kernel32.dll)中始终位于应用程序之外,因此它们肯定不受运行时选择的影响。

我会说你真正的问题是尝试使用GetProcAddress调用C ++方法。 Win32 API仅用于动态调用C函数。您将遇到的第一个问题是,由于C++'s name mangling,您将无法找到方法的名称。您可能在分配对象时遇到问题。我的直觉告诉我,几乎不可能正常工作。

以下是三个建议的替代方案,而不是使用GetProcAddress直接调用C ++方法:

  1. 用C函数包装C ++方法。
  2. 使用像COM或Qt plugins这样的C ++框架来设置动态DLL接口。
  3. 使用其他平台,例如.NET或Java;一个完全支持面向对象反射和动态调用。