tlb文件是否具有关联体系结构

Does a tlb file have an association architecture?

本文关键字:关联 体系结构 文件 是否 tlb      更新时间:2023-10-16

我有一个32位的DLL,设计为通过com模型和相关的tlb文件访问。

DLL显示为x86.

有没有办法从x64程序访问这种DLL ?tlb文件与x86/x64无关吗?

我之所以问这个问题,是因为有些函数似乎可以工作,有些则崩溃了,而o - t - h - e - r - s - a - r - e - m - I - s - s - I - n - g - c - o - m - p - a - r - e - d - t - o - t - h - e - e -。_ n _ e _ t _ a _ s _ e _ m _ b _ l _ i _ e _ s _

——编辑——

由于OEM部分的错误而出现组件缺失。

在大多数情况下,类型库当然是平台无关的。你在Windows编程中遇到的大多数由微软提供的程序都是这样。在。net中最明显,这使得编写可以在32位或64位模式下运行的代码非常简单,由AnyCPU平台目标公开。使用Microsoft.Office.Interop中的互操作类或编写在Office程序中运行的扩展都不需要特别的东西,你使用的是完全相同的类型库。

但是,当你使用一个程序员创建的类型库时,它并不总是工作得很好,这个程序员从来没有考虑过它可以在64位代码上工作。最典型的问题是由方法参数引起的,这些参数实际上是底层的指针,但被扁平化为整型,long是典型的选择。这些指针值在64位模式下是64位宽的,当您试图将它们塞进32位整数中时会出现错误行为。句柄值就是一个很好的例子。

到目前为止,最臭名昭著的错误是微软的。ADO的类型库被破坏了,这是一个广泛用于与数据库引擎通信的数据库提供程序库。他们在Windows 7 SP1上做了一个重大改变,当程序员在该操作系统上编写程序时,发现它不能在旧版本的Windows上运行时,这一改变引起了广泛的痛苦。那就反过来了,一个在64位操作系统上应该是32位的类型,在64位操作系统上却被声明为64位。当你有Windows SDK版本8,adoint_backpat .h头文件,ADO_LONGPTR类型时,你可以看到这一点。在adot .h.

中被long代替。

最好和原来的程序员一起把这个问题解决掉。或者为了利用COM代理,当从64位进程调用时,它们可以在进程外运行32位代码。

Type Library在SYSKIND枚举中包含x86 vs x64标志。事实上,它甚至支持16位Windows。它可以使用typelib::GetLibAttr方法读取,如下所示:

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);
    CComPtr<ITypeLib> tlb;
    LoadTypeLib(L"C:\myPath\MyFile.tlb", &tlb);
    TLIBATTR *patt;
    tlb->GetLibAttr(&patt);
    switch(patt->syskind)
    {
        case SYSKIND::SYS_WIN64:
            printf("WIN64");
            break;
        case SYSKIND::SYS_WIN32:
            printf("WIN32");
            break;
        case SYSKIND::SYS_WIN16:
            printf("WIN16");
            break;
    }
    tlb->ReleaseTLibAttr(patt);
    CoUninitialize();
}

注意SYSKIND不是一个标志,它是一个枚举,你没有类似"any CPU"的值

已经有很长时间了,但我认为正确的答案是'视情况而定'。有些事情可以透明地处理,有些则不能。我的猜测是,大多数时候会有一些特定于平台的比特,但更了解这方面的人可能会纠正我。

试试这篇关于将midl(用于生成com类型库的语言)移植到64位的文章。http://msdn.microsoft.com/en-us/library/ms810720.aspx

但实际上你的问题不在于tlb。这只是一堆类型描述符。问题将是这些类型在dll中的实现。你不能将32位的dll加载到64位的进程中。我可以在Windows上将32位DLL加载到64位进程中吗?

一个可能的解决方案,如果你不能移植dll,涉及代理32位进程和进程间通信http://blog.mattmags.com/2007/06/30/accessing - 32位dll -从- 64位code/