什么数据类型适合在 ActiveX 方法中处理二进制数据?

2023-12-31

我正在为我的朋友编写一个 ActiveX 控件,它应该封装加密例程。主要从 VB6 开始使用。我应该为加密密钥、初始化向量、输入和输出数据等二进制数据选择什么数据类型,以便我的朋友可以方便地从VB6使用它?

我正在使用 Delphi 7 来编写这个 ActiveX,如果这很重要的话。一种选择是使用十六进制字符串。另一个可能是什么?


VB6 二进制数据存储在字节变量和数组中。

Dim arrData() As Byte

VB6 应用程序应该将该变量传递给您的 Delphi COM,如下所示OleVariant。 Delphi COM可以转换VarArray to TStream反之亦然:

procedure VariantToStream(const v :OleVariant; Stream: TStream);
var
  p : pointer;
  lo, hi, size: Integer;
begin
  lo := VarArrayLowBound(v,  1);
  hi := VarArrayHighBound (v, 1);
  if (lo >= 0) and (hi >= 0) then
  begin
    size := hi - lo + 1;
    p := VarArrayLock (v);
    try
      Stream.WriteBuffer (p^, size);
    finally
      VarArrayUnlock (v);
    end;
  end;
end;

procedure StreamToVariant(Stream: TStream; var v: OleVariant);
var
  p : pointer;
  size: Integer;
begin
  size := Stream.Size - Stream.Position;
  v := VarArrayCreate ([0, size - 1], varByte);
  if size > 0 then
  begin
    p := VarArrayLock (v);
    try
      Stream.ReadBuffer (p^, size);
    finally
      VarArrayUnlock (v);
    end;
  end;
end;

用途在CoClass unit:

// HRESULT _stdcall BinaryTest([in] VARIANT BinIn, [out, retval] VARIANT * BinOut );
function TMyComClass.BinaryTest(BinIn: OleVariant): OleVariant; safecall;
var
  Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  try
    VariantToStream(BinIn, Stream);
    Stream.Position := 0;

    // do something with Stream ...

    // ... and return some Binary data to caller (* BinOut)
    Stream.Position := 0;
    StreamToVariant(Stream, Result);
  finally
    Stream.Free;
  end;
end;

这是最常用的方法SAFEARRAY通过 COM 自动化处理二进制数据的字节数。
将数据填充到BSTR(十六进制字符串、Base64 编码等..)对我来说听起来有点难看,看起来更像是一个 hack。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么数据类型适合在 ActiveX 方法中处理二进制数据? 的相关文章

  • Delphi 中表单分发与其生命周期相关的接口对象的安全方法?

    我有一个 Delphi 表单 它提供接口对象背后的功能 代码的其他部分也通过属于该表单的属性获取引用 我无法将接口功能委托给子对象 因为太多的功能是由表单上的控件 组件提供的 我无法使用 TAggregateObject 或 TContai
  • Delphi - Indy - 保存 GMail 草稿

    我一直在 Delphi 下使用 Indy 通过 gmail 帐户发送消息 使用 TIdSMTP 和 TIdMessage 组件 这绝对没问题 但是 我的客户请求将消息保存到 DRAFTS 文件夹 以便他在实际发送消息之前对 以编程方式创建的
  • 任何第三方都可以从我的项目加载嵌入式资源吗?

    请参考我的一篇之前的问题 https stackoverflow com questions 14681364 issues passing data from dll to application 我问的是如何从 DLL 加载已编译的资源
  • Delphi 7 - 处理表单中嵌入框架的 MouseWheel 事件?

    你好 我有一个表格 里面有几个框架 对于某些框架 我希望滚动内容 或至少处理鼠标滚轮事件 我已经尝试过以下方法 只需为每个帧分配一个 OnMouseWheel 事件处理程序 重写父窗体的 MouseWheel 事件 procedure TF
  • Delphi:现场记录应用程序错误

    使用 Delphi 7 我想知道是否有一个免费组件可以在我的应用程序在远程站点运行时收集诊断信息并帮助我调试错误报告 也许它会记录每个选择的菜单项 单击的控件 文本输入等 也许它只是在崩溃时转储堆栈 也许它还有其他作用 我不介意添加代码 例
  • MainFormOnTaskbar + 工具提示导致焦点窃取

    我使用 Delphi XE2 构建了下面的代码 它创建 Form1 Form1 立即创建 Form2 的实例 当我按下 Form2 上的按钮时 会创建第二个 Form2 现在 如果我将鼠标悬停在第二个 最上面的 Form2 上的按钮上 并等
  • 使用 Delphi 10.2.1 Tokyo 的模态 Android 对话框

    我有以下用于在 Android 上显示模式消息的 Delphi 代码 该代码在 10 1 Berlin 上运行良好 但在 Delphi 10 2 1 Tokyo 上停止运行 此过程现在会挂起 Android 应用程序 procedure c
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 德尔福和Doxygen

    我想使用 doxygen pas2dox 记录我的源代码 当我设置好所有内容 包括过滤器和提取选项 提取所有内容 时 doxygen 运行良好 但生成的文档仅包含源文件作为链接 并且没有提取类型 方法 过滤后的源看起来不错 有任何提示如何定
  • 通过“修改日期”确定文件夹中的哪个文件是最新的?

    我需要扫描特定文件夹中的最新文件 基本上检查修改日期以查看哪个是最新的 但请记住这些文件具有随机名称 这是我到目前为止得到的 procedure TForm1 Button1Click Sender TObject begin ftp Ho
  • VB6 ActiveX exe - 正确的注册顺序是什么?

    我最近更新了一个 Visual Basic 6 应用程序 它是一个 ActiveX exe 在 Windows XP 上运行 我有几个此应用程序的测试人员 他们已收到 exe 的副本并正在尝试运行它 但是 他们收到一条错误消息 Unexpe
  • 帮助将二进制图像数据从 SQL Server 读取到 PHP 中

    我似乎无法找到将二进制数据从 SQL 服务器读取到 PHP 的方法 我正在开发一个项目 需要能够将图像直接存储在 SQL 表中 而不是文件系统上 目前 我一直在使用这样的查询 插入 myTable 文档 选择 从 OPENROWSET BU
  • Vista 中的文本转语音

    我通过在 2000 NT XP 中使用 Delphi 创建 OLE 对象来做到这一点 如下所示 Voice CreateOLEObject SAPI SpVoice Voice speak 但这在 Vista 中不起作用 我怎样才能让我的程
  • 寻找示例项目和“如何创建”VB6 Activex EXE

    我正在学习如何创建 VB6 Active X EXE 我需要为许多 VB6 应用程序添加 打电话回家 到服务器的功能 我想集中此功能 但不想使用 DLL 来实现 因为我只想需要防火墙权限one程序 phone home ActiveX EX
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • 为什么不提高EInvalidPointer?

    德尔福文档状态 http docwiki embarcadero com Libraries en System SysUtils EInvalidPointer 切勿提出E无效指针直接异常 E无效指针由内存管理器内部引发 我正在编写一个自
  • 使用 Inno Setup 中格式化(部分粗体)的文本制作安装程序?

    有人看过 GOG com 游戏安装程序吗 如何制作像这样的欢迎文本字符串 包括单个标题中的路径和需要大小 其中部分内容加粗 以下是修改安装路径后如何更改字符串换行的示例 您可以使用TRichEditViewer http www jrsof
  • 如何获取属于某个进程的打开句柄的计数?

    您可以使用该程序流程浏览器 http technet microsoft com en us sysinternals bb896653查看正在运行的应用程序有多少个句柄 有没有办法用Delphi代码来获取这个数字 我有兴趣跟踪应用程序本身
  • PHP 和 ADODB 连接失败

    我的任务是迁移服务器 这包括移动我没有构建的应用程序 其中一些具有 ADODB connection 我似乎无法在新服务器上修复它 我只得到空白屏幕 我已经对 ADODB connection 与 PHP 进行了相当广泛的研究 但找不到明确
  • 如何等到我启动的程序使用完该文件后才删除该文件?

    我一直在寻找一种方法来打开通过 Delphi 应用程序及其适当的应用程序保存到我的计算机上的文件 该文件存储在 SQL 数据库中的 Varbinary 字段中 加载到内存流中 然后通过 TMemoryStream 的 SavetoFile

随机推荐

  • 我应该等待 ValueTask 吗?

    这将是一个有效的实施ValueTask请 缓存服务从缓存或数据库返回数据 public async ValueTask
  • 如何在 PowerShell 中检查现有文件后关闭表单 GUI?

    我想检查一个现有的文件 如果进程仍在等待该文件 它将显示一个GUI窗口 文件存在后 窗口将自动关闭 我尝试了这段代码 窗口无法关闭 即使文件已经存在 检查文件 SN 708TSTA MAC 2E5961370 function Find n
  • R根据条件返回列名

    对于以下数据框 DF lt data frame Row c 1 2 3 4 5 2 04 c 1 1 0 1 1 2 05 c 0 0 0 0 1 2 06 c 1 0 0 0 1 2 07 c 1 0 0 0 1 2 08 c 1 1
  • 具有多个父项的 Activity 的 Android 向上导航

    我在实施时遇到问题向上导航在具有此导航树的应用程序上 后退按钮的标准实现很好 当尝试实现向上按钮时 问题就开始了 我的期望 当用户开机时详情 5 活动然后按向上按钮 应用程序将转到清单 3 活动 当用户开机时详情 7 活动然后按向上按钮应用
  • SQLite - 替换字符串的一部分

    是否可以使用SQL in an SQLite表替换部分字符串 例如 我有一个表 其中一个字段保存文件的路径 是否可以替换字符串的某些部分 例如 c afolder afilename bmp becomes c anewfolder afi
  • Ruby Torrent 库

    Ruby 有什么好的库可以与 BitTorrent 跟踪器一起使用吗 下载或种子文件 rubyforge 上有一个 ruby torrent 库 但它最后一次更新是在 2005 年 似乎不再工作了 参见 lib torrent ruby h
  • 了解 C# 字段初始化要求

    考虑以下代码 public class Progressor private IProgress
  • 如何使用 PHP DOM 查询从 HTML 表中选择文本?

    如何使用 PHP DOM 查询从 HTML 表格单元格获取文本 HTML 表格是 table tr th Job Location th td a href Kabul a td tr tr th Nationality th td Afg
  • C# 中的索引错误,其中数组应返回空数组但返回超出范围

    我是 C 新手 遇到错误 需要让 DataPoints 数组返回空 但无论出于何种原因 我都会收到此错误 我在这里做错了什么 指数超出范围 必须为非负数且小于 集合 r n参数名称 索引 var DataPoints new DataPoi
  • 错误错误:StaticInjectorError(AppModule)[UserformService -> HttpClient]:

    在尝试添加 PrimeNG 表时 我在这里破坏了我的构建 https github com BillyCharter87 Tech O Dex UI tree BrokeIt https github com BillyCharter87
  • ISO UTC DateTime 格式作为 MVC 6 API 响应中的默认 json 输出格式

    有谁知道如何在返回 DateTime 对象时将 MVC6 的 json 输出配置为默认为 ISO UTC DateTime 字符串格式 在 WebApi2 中 我可以设置 JsonFormatter SerializerSettings 并
  • 如何为strip文件配置cmake

    当我在发布模式下使用 cmake 时 我有以下二进制文件 64 bit LSB executable x86 64 version 1 SYSV dynamically linked interpreter lib64 ld linux x
  • 通过 Link Server 连接时,如何将 Oracle TIMESTAMP 数据类型转换为 SQL Server DATETIME2 数据类型。

    我已经尝试过一些例子 但到目前为止还没有工作 我有一个Link Server SQL Server 2014 to an Oracle 12C Database 该表包含数据类型 TIMESTAMP 其数据如下 22 MAR 15 04 1
  • 胖模型/瘦控制器与服务层[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我多年来一直使用 Net 开发企业应用程序 我的应用程序通常有一个域模型 其中包含映射到 SQL DB 表的实体 我使用存储库模式 依赖注入和服
  • 梯度下降与随机梯度下降算法

    我尝试在 MNIST 手写数字数据集 包括 60K 训练样本 上训练前馈神经网络 我每次都迭代所有训练样本 表演反向传播对于每个时期的每个这样的样本 运行时间当然太长了 我运行的算法是否命名为梯度下降 我读到对于大型数据集 使用随机梯度下降
  • Google Apps 脚本 - createEvent 函数不创建日历事件

    我们正在尝试使用 Google 表单创建在线表单来接受预约请求 这个过程应该是这样的 用户填写表格并提交信息 有效 一封电子邮件会发送到我们的 Gmail 通知我们有新的传入请求 这有效 我们进入谷歌电子表格 有3张 一张名为Request
  • 如何使代理从源重新验证资源

    我的原始服务器在同一台机器上有一个 Nginx 反向代理 我希望代理缓存来自源的动态内容 但是当客户端重新验证资源时 我希望代理也使用源重新验证 而不仅仅是在不检查源的情况下向客户端返回 304 例如 如果我将 max age 设置为 60
  • LibGDX 桌面启动器失败

    我一直在关注this https www youtube com watch v ir6O5hS Qk在线教程 我现在正在看第 2a 集 我尝试跑步DesktopLauncher第一次 我收到了一堆警告和这个错误 任务 desktop De
  • Glassfish 应用程序无法与 Maven 库(gf-client)一起使用

    在学校作业中 我收到了一个使用 JNDI 和 JMS 以及 Glassfish 3 开源版本 的 Netbeans 项目 此应用程序使用的所有 Glassfish 库均通过绝对路径引用 所有其他库 在 lib 文件夹中 均通过相对路径引用
  • 什么数据类型适合在 ActiveX 方法中处理二进制数据?

    我正在为我的朋友编写一个 ActiveX 控件 它应该封装加密例程 主要从 VB6 开始使用 我应该为加密密钥 初始化向量 输入和输出数据等二进制数据选择什么数据类型 以便我的朋友可以方便地从VB6使用它 我正在使用 Delphi 7 来编