2012-06-06 24 views
4

我正在写一个测试C dlll,包含一些函数的小型C++程序。这些DLL存在于调试版本和发行版本中,我想用相同的程序加载它们,并将它们与以前的版本进行比较。dll在调试模式下,在发布模式下调用程序(反之亦然)

问题是,当我使用release config编译我的程序时,它只能使用也是release的dll,而当我使用debug config编译程序时,它只能使用也是debug的dll。

我使用LoadLibrary和GetProcAddress函数加载dll /函数。

有两种类型的功能: void type1(int&)void type2(vector<string>*)。 类型1工作正常,无论配置。 但类型2仅在配置匹配时才起作用。

代码:

 
typedef void(*GetNames)(vector<string>*); 
GetNames get_var_names = (*GetNames)GetProcAddress(dll,"get_var_names"); 
vector<string> var_names; 
get_var_names(&var_names); 

最后一行是该计划失败,这样的错误,其中“0000005:访问冲突读取位置0xbaadf008”如果调用程序和dll的配置不匹配。 该错误是一个阅读违规当程序是释放和DLL调试,但写程序时,调试程序和DLL是释放。

函数应该做的只是用不同的字符串调用push_back(“x”)几次。

在释放配置程序中使用调试DLL或类型1的所有函数都不起作用似乎不是完全不可能的,所以它似乎与向量或字符串类有关。

任何人都有任何想法如何解决这个问题或正在使用两个不同配置的可执行文件我唯一的选择?

+0

请给出您用于两种配置的编译器选项。例如,每个配置可能使用不同的默认调用约定(或其他一些使它们不兼容的选项)。 – cdhowie

+1

您可以关闭迭代器调试以使它们兼容。但是,当医生的建议像这样伤害时,只是不这样做。 –

回答

4

很多(如果不是全部的话)STL类为DEBUG构建使用不同的布局。因此,你不能在程序的RELEASE-build中使用这样的DEBUG编译的类(如std :: string和std :: vector),反之亦然。

应该避免在您的dll的界面中使用STL类型/类,而应该使用内置类型。 在这种情况下,你永远不会有这些问题。

顺便说一句:我正在谈论MSVC++当然(我不知道其他编译器)。

相关问题