2010-12-13 45 views
0

我开发了使用vs2005的MFC Regular DLL“Static Linked”。当它被编译为32位DLL时Win7上的LoadLibrary问题(64位)

我可以使用“LoadLibrary”从我的机器或任何其他机器加载它。

但编译为64位DLL时,我只能从我的机器加载它。

我查看我的代码并找到声明的全局对象。

MyClass myObj; 
当我评论这个object..I可以加载DLL并使用它从不同势machine.but当任何

全局对象发现

...我不能从diffrenet机加载我的DLL。

任何人都可以帮助我吗?

+1

其他机器64位兼容吗? – 2010-12-13 12:43:06

+0

yes..it Win7 64位也 – NMM 2010-12-13 12:45:57

+2

你的DLL有任何依赖?使用sysinternals中的depends.exe – Benoit 2010-12-13 12:52:11

回答

2

,当我尝试使用 “GetLastError函数”,它返回象数 “-529697949”

错误代码是0xe06d7363,最近3个十六进制数字拼 “MSC”。这是Microsoft编译器中C++异常的例外代码。

您的代码正在轰炸未捕获的C++异常,可能抛出DllMain()。如果您无法从此提示中进行逆向工程,则需要调试器。

+0

你能解释我该如何做到这一点? – NMM 2010-12-13 14:42:57

+0

我没有DLLmain在我的DLL – NMM 2010-12-13 14:53:02

+0

嗯,我只能猜测。通过调试器告诉你的内容。 – 2010-12-13 15:06:32

0

当您的dll的全局/静态对象被创建/分配/初始化(这是DllMain的一部分)时,也可以抛出未被捕获的C++异常。所以有一个很好的机会,在代码中的某个地方有一个有效的throw语句负责这种行为(而不是某些编译器/体系结构/平台错误;也许它只是一个x64特定的定义?)。

要找到讨厌的小*#!!:

  • 编译与调试信息(/ DEBUG)
  • 打开符号服务器(调试/选项/调试/符号/符号文件上的所有代码(.pdb)位置:
  • 打开所有打破例外(调试/例外... /勾选“Thrown”列中的所有[]]
  • 开始调试,您将最终找到正确的地方。

由于缺少强制执行的“throws”语句,例如,在Java中(在C++中它是可选的,非常没用;请参阅Throw keyword in function's signature),try/catch/throw系统几乎不可用于创建健壮且可维护的代码;它几乎就像隐藏随机gotos到处。