Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ tlb文件是否与体系结构有关联?_C++_Windows_Com_32bit 64bit - Fatal编程技术网

C++ tlb文件是否与体系结构有关联?

C++ tlb文件是否与体系结构有关联?,c++,windows,com,32bit-64bit,C++,Windows,Com,32bit 64bit,我有一个32位的DLL,可以通过com模型和相关的tlb文件进行访问 DLL似乎是x86 有没有办法从x64程序访问这种DLL?tlb文件x86/x64是否不可知 我之所以这样问是因为我问的是因为一些功能似乎工作,一些功能出现工作,其他功能崩溃,一些功能出现工作,其他功能崩溃,以及一些功能出现工作,一些功能出现工作,一些功能出现工作,其他功能出现崩溃,其他功能出现崩溃,以及o,t,t,t,一些功能出现工作,其他功能出现崩溃,以及o,t,t,t,一些功能出现工作,以及以及o,t,t,t,t,t,t

我有一个32位的DLL,可以通过com模型和相关的tlb文件进行访问

DLL似乎是x86

有没有办法从x64程序访问这种DLL?tlb文件x86/x64是否不可知

我之所以这样问是因为我问的是因为一些功能似乎工作,一些功能出现工作,其他功能崩溃,一些功能出现工作,其他功能崩溃,以及一些功能出现工作,一些功能出现工作,一些功能出现工作,其他功能出现崩溃,其他功能出现崩溃,以及o,t,t,t,一些功能出现工作,其他功能出现崩溃,以及o,t,t,t,一些功能出现工作,以及以及o,t,t,t,t,t,t,t,h,h,h,h,e,h,h,h,h,以及以及o,t,t,t,t,t,t,t,t,t,t,t,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,h,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,t̶,h̶,e̶.̶,n̶,e̶,t̶,a̶,s̶,e̶,m̶b̶,l̶,I̶,e̶,s̶

--编辑--


由于OEM零件上的错误,出现缺少的组件

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

试试这篇关于将midl(用于生成com类型libs的语言)移植到64位的文章

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

如果无法移植dll,可能的解决方案包括代理32位进程和进程间通信

类型库中确实包含x86 vs x64标志。事实上,它甚至支持16位窗口。可以使用如下方式读取:

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();
}
int-tmain(int-argc,_-TCHAR*argv[]
{
共初始化(空);
首席财务官tlb;
LoadTypeLib(L“C:\\myPath\\MyFile.tlb”、&tlb);
TLIBATTR*patt;
tlb->GetLibAttr(&patt);
开关(patt->syskind)
{
案例SYSKIND::SYS\U WIN64:
printf(“WIN64”);
打破
案例SYSKIND::SYS\U WIN32:
printf(“WIN32”);
打破
案例SYSKIND::SYS_WIN16:
printf(“WIN16”);
打破
}
tlb->ReleaseTLibAttr(patt);
coninitialize();
}

注意:SYSKIND不是一个标志,它是一个枚举,您没有类似“任何CPU”的值。

类型库在大多数情况下肯定是不受平台影响的。在微软提供的Windows编程中,您遇到的大多数人都是。在.NET中最为明显,这使得编写可在32位或64位模式下运行的代码非常简单,由AnyCPU平台目标公开。使用Microsoft.Office.interop中的interop类或编写在Office程序中运行的扩展不需要任何特殊功能,您使用的是完全相同的类型库

但是,当您使用一个程序员创建的类型库时,这种情况并不总是很好,因为程序员从未考虑过它可以处理64位代码。最典型的问题是由方法参数引起的,这些参数实际上是隐藏的指针,但被展平为整型,长期以来一直是典型的选择。在64位模式下,这些指针值是64位宽的,当您试图将它们填充到32位整数中时,它们会出现错误行为。句柄值就是一个很好的例子

到目前为止,最臭名昭著的oops是微软的。ADO的类型库被破坏了,这是一个广泛用于与dbase引擎对话的数据库提供程序库。他们在Windows7SP1中进行了突破性的更改,当程序员在该操作系统中构建程序时,发现它不再适用于旧版本的Windows,这一更改造成了广泛的痛苦。oops则相反,在64位操作系统上,这种类型应该是32位的,但在64位操作系统上被声明为64位的。当您使用Windows SDK版本8、adoint_Backcompat.h头文件、ADO_LONGPTR类型时,可以看到此oops。在adoint.h中替换为long


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

COM是进程之间隔离它们的某种通信方法吗?COM本身不是。COM可以是进程内或进程外。DCOM是脱离过程的风格。D用于分布式的、独立的进程或机器,以及通过rpc的代理调用。因此,您可以有一个32 rpc进程,可以通过dcom连接到该进程。Dom是实现pic的一个选项。对你来说可能是个不错的选择。此时,您已经解决了流程问题,然后可以返回到类型库问题,即一句话应该是“dcom是实现ipc的一个选项”。该死的自动更正和太多的首字母缩略词