【发布时间】:2013-09-20 04:19:11
【问题描述】:
我的公司使用第 3 方 DLL 来连接某些硬件(我在这里将其重命名为 hwLib)。我认为它是很久以前用 VB6 编写的。 DLL 附带一个安装程序,用于注册自身等。
我们有一个使用它的 C# 应用程序,它在 XP 和 Win7、32 位或 64 位上运行良好。但我写了一个简单的 C++ 控制台应用程序,它在 XP/32 位上运行良好,但在 Win7/64 位上崩溃。控制台应用程序看起来像这样,
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
using namespace hwLib;
ChwLib^ myLib = gcnew ChwLib();
String^ str = myLib->GetDllVersion();
Console::WriteLine(L"Hello hwLib");
Console::WriteLine(str);
Console::ReadLine(); //to keep window open til you hit the "any" key
return 0;
}
未处理的异常:System.InvalidCastException:无法转换 COM 'hwLib.ChwLibClass' 类型的对象与类型 'hwLib._ChwLib' 的接口。
此操作失败,因为 COM 上的 QueryInterface 调用 带有 IID 的接口组件 “{E0560D1E-9A54-4EBF-83E8-D7BD2C936512}”由于以下原因而失败 错误:
不支持此类接口(来自 HRE SULT 的异常: 0x80004002 (E_NOINTERFACE))。在 System.StubHelpers.StubHelpers.GetCOMIPFromRCW(对象 objSrc,IntPtr pCPCMD、布尔值和 pfNeedsRelease)在 hwLib.ChwLibClass.GetDllVersion() at main(String[] args) at mainCRTStartupStrArray(String[] arguments)
C# 程序是一个更大更复杂的程序,否则我会在这里发布它,它在同一个系统上运行没有问题。
COM 早于我的时代 - 我可能在 10 或 15 年前参加过它的课程,但我不记得了 - 关于如何开始调试它有什么建议吗?谢谢!!
【问题讨论】:
-
您的意思是您正在尝试使用 64 位 CLR 应用程序来访问 32 位 DLL?据我所知,这是不可能的 - 我认为如果不编译为 32 位,您将无法做到这一点。 stackoverflow.com/questions/128445/…stackoverflow.com/questions/2804818/…