- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 COM/DCOM 在两台 Windows PC 计算机之间传输具有以下结构的一些记录。我更喜欢一次传输一个数组,例如 TARec 的 100 名成员,而不是单独传输每个记录。目前我正在使用 IStrings 执行此操作。我希望使用原始记录来改进它,以节省两端编码/解码字符串的时间。请分享您的经验。
type
TARec = record
A : TDateTime;
B : WORD;
C : Boolean;
D : Double;
end;
所有记录的字段类型均与 OLE 兼容。非常感谢。
最佳答案
正如 Rudy 在评论中建议的那样,如果您的数据包含简单的值类型,那么变体字节数组可能是一种非常有效的方法,并且实现起来非常简单。
既然您已经声明您的数据已经驻留在数组中,则基本方法是:
创建所需大小的字节数组来保存所有记录数据(使用类型为 varByte 的 VarArrayCreate
)
锁定数组以获取可安全用于引用内存中数组内容的指针(VarArrayLock
将锁定并返回指向数组数据的指针)
使用CopyMemory
直接将数据从记录数组复制到字节数组内存。
解锁变体数组 (VarArrayUnlock
) 并通过 COM/DCOM 接口(interface)传递它
在另一侧(“接收”),您只需反转该过程即可:
我过去在要求非常严格的 COM/DCOM 场景(w.r.t 效率/性能)中非常成功地使用了这种方法。
如果您的数据发生更改以包含更复杂的类型(例如字符串或动态数组),则需要进行额外的工作才能通过字节数组正确传输这些数据。
如果您的数据结构发生变化,那么界面两侧的代码都需要相应更新。防止这种情况的一种方法是采用某种机制来让接收者识别数据是否有效。例如,这可能包括一个“版本号”和/或一个值(在“ header ”中作为字节数组的一部分,除了数组数据之外,或者完全作为单独的参数传递 - 精确的细节并不重要)。如果接收方发现它不期望的版本号或大小,那么它可以优雅地报告这一点,而不是天真地错误地处理数据并(很可能)导致崩溃或抛出异常。
对齐/包装问题。即使记录类型的声明相同,如果使用不同的对齐设置编译代码,那么内存中每个记录所需的大小也可能会发生变化(这就是为什么数据结构格式的“版本号”本身可能不可靠)。避免这种情况的一种方法是将记录声明为打包
,尽管这会以稍微降低效率为代价(并且仍然依赖于接口(interface)双方都同意数据结构是打包
)。
但是,有一些事情需要牢记,而不是规定性的。您的实现需要有多复杂/稳健将取决于您的具体情况。
关于delphi - 在DCOM中传输记录最快的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39064627/
似乎对 DCOM 有很多敌意,我很想知道为什么。对于仍在使用 C++ 写入 Win32 SKD 的公司,是否有真正的理由在当前或 future 的开发中不使用 DCOM?某些 future 版本的 W
我收到此错误 Source : DCOM Event_ID: 10010 "The server {6FC4FDAE-96C8-11D3-9F9C-005004053207} did not regi
我试图掌握 OPC 和 DCOM 之间的联系。四个教程我都看完了here我想我对什么是 OPC 有很好的感觉,但是在其中一个教程(第三个 35 秒)中,叙述者指出 OPC 基于 DCOM,但我不明白这
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在学习 DCOM,我需要调试我创建的类,我该怎么做? 最佳答案 我认为DebugBreak可能对此有很大帮助。您只需要在调试版本中添加条件编译行以允许执行该行,调试器就会启动。另一种方法是将调试器
我有一个比较老的项目:DCOM客户端和服务器,都是C++\ATL,只有Windows平台。一切正常:本地和远程客户端连接到服务器并同时工作,没有任何问题。 但是当远程客户端崩溃或被任务管理器或“tas
我有一个使用 OLE 自动化编码器的 DCOM 客户端和服务器应用程序。它们在同一台 PC 上运行时工作正常,但当服务器位于不在同一域中的不同 PC 上时,我得到 E_ACCESSDENIED (0x
在客户端/服务器环境中,服务器实现了 COM 接口(interface),在某些情况下连接由于某种原因丢失(客户端崩溃),但它在服务器上保持事件的线程实例,消耗内存,直到应用程序定稿。 有什么方法可以
我可以使用 DCOMCNFG 禁用 DCOM 应用程序上的远程启动,但我想以编程方式执行此操作。我查看了 CoInitializeSecurity,但这似乎不起作用。有人做过吗? 顺便说一句,我正在使
我有一个关于多线程的概念性问题: 在通过 DCOM 使用 RPC 的应用程序中,使用多线程单元配置,主窗体卡住。 1 - 如果 CriticalSession 在单元初始化时创建,那么 Critica
我正在使用 2 台 PC,它们都运行 Windows XP。两者都在其 DCOM 接口(interface)上注册了相同的应用程序。现在我正尝试从一台计算机在另一台计算机上启动该程序。 首先我调用了
我们目前有许多 C++/MFC 应用程序通过 DCOM 相互通信。现在我们将更新应用程序,并希望用更现代、更易于使用的东西替换 DCOM。但我们不知道是什么。你怎么看 编辑 交换的数据不是其他人可能感
下午, 如主题所述,我在尝试运行使用 DCOM 代理的 Web 应用程序时收到此错误。 “检索 CLSID 为 {82154420-0FBF-11D4-8313-005004526AB4} 的组件的
我有一个第 3 方 DCOM 组件,我需要在我的安装程序中以自动方式安装和配置其启动设置(无需用户干预)。我使用 regsvr32.exe 进行 .dll 注册并使用 powershell 设置启动设
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
我必须使用命令行为网络服务用户设置 DCOM 权限。我已经用谷歌搜索它无济于事。预先感谢您的帮助,抱歉我的英语不好。 最佳答案 我唯一能找到的就是“dcomperm 样本”,它是 included i
有没有办法以编程方式获取有关启动 DCOM 应用程序标识的信息。请参阅所附图片以了解我的意思。 我尝试使用 WMI ManagementObjectSearcher s = new Managemen
我正在尝试使用 DCOM(进程外)实现两件事 使用 CoInitializeSecurity 及其参数 pAuthList 设置进程范围的身份验证。 在特殊情况下(COM 调用)使用伪装来更改调用者的
我知道 .net 有 WCF,我相信当它的代号为 Indigo(?)时,它被吹捧为 COM 的替代品 - 但它实际上适合在 .NET 应用程序中使用,提供与 C++/相同的功能DCOM 应用程序? 客
我正在开发一个 DCOM 应用程序,服务器和客户端位于两台计算机上,两台计算机都运行带有 Service Pack 2 的 WinXP。在两台计算机上,我使用相同的用户名和密码登录。 当一台机器上的客
我是一名优秀的程序员,十分优秀!