我想要的很简单-有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;完全支持面向对象反射和动态调用。