菜鸟小杰 发表于 2 小时前

调用外部DLL问题

本帖最后由 菜鸟小杰 于 2026-10-21 18:16 编辑

<火山程序 类型 = "通常" 版本 = 1 />

方法 RSA_Encrypt <公开 静态 类型 = 整数 @输出名 = "RSA_Encrypt" @视窗.输入 = "..\\..\\..\\openssl\\Crypto_X64.dll">
参数 密钥文本 <类型 = 文本型>
参数 密钥类型 <类型 = 整数>
参数 待处理数据 <类型 = 字节集类>
参数 数据长度 <类型 = 整数>
参数 填充方式 <类型 = 整数>
参数 摘要算法 <类型 = 整数>
参数 结果指针 <类型 = 变整数>
参数 结果长度 <类型 = 整数>
{

}


.版本 2

.DLL命令 RSA_加密, 整数型, "Crypto_X86.dll", "RSA_Encrypt"
    .参数 密钥文本, 文本型
    .参数 密钥类型, 整数型, , -1自动 0公钥 1私钥
    .参数 待处理数据, 字节集
    .参数 数据长度, 整数型
    .参数 填充方式, 整数型, , 0=PKCS#1 v1.5   1=OAEP   2=NONE(裸RSA,数据长度须为密钥字节数的整数倍)
    .参数 摘要算法, 整数型, , 0=SHA11=SHA2242=SHA2563=SHA3844=SHA5125=MD56=SHA512/2247=SHA512/2568=RAW 9=SM3 10=SHA3-224 11=SHA3-256 12=SHA3-384 13=SHA3-512
    .参数 结果指针, 整数型, 传址
    .参数 结果长度, 整数型, 传址



一个是火山的 一个是易的    易语言正常调用没问题 .参数 待处理数据, 字节集这个参数要求字节集    不能改成指针   火山 用字节集类就不行 直接崩溃    火山没有对应易语言的 字节集类型吗
说明一下易语言是 X86调用   火山是X64调用    两种DLL都是对应调用的 已测试X64其他函数正常


韦贝贝 发表于 半小时前

<火山程序 类型 = "通常" 版本 = 1 />

包 火山.程序

类 RSA加解密 <公开 基础类 = 对象类>
{

    # 说明:本类封装 Crypto_X64.dll 的 RSA_Encrypt。所有“缓冲区/指针”参数一律用 变整数 传裸指针,
    #       绝不能把“字节集类”对象直接传给 DLL(那是类对象不是数据,会崩)。详见“加密”方法里的注释。

    方法 RSA_加密 <公开 静态 类型 = 整数 @输出名 = "RSA_Encrypt" @视窗.输入 = "..\\..\\..\\openssl\\Crypto_X64.dll">
    参数 密钥文本指针 <类型 = 变整数>
    参数 密钥类型 <类型 = 整数>
    参数 待处理数据指针 <类型 = 变整数>
    参数 数据长度 <类型 = 整数>
    参数 填充方式 <类型 = 整数>
    参数 摘要算法 <类型 = 整数>
    参数 结果指针 <类型 = 变整数>
    参数 结果长度 <类型 = 变整数>

    方法 加密 <公开 静态 类型 = 字节集类>
    参数 密钥文本 <类型 = 文本型>
    参数 密钥类型 <类型 = 整数>
    参数 待加密数据 <类型 = 字节集类>
    参数 填充方式 <类型 = 整数>
    参数 摘要算法 <类型 = 整数>
    {
      // 易用封装:对外只暴露“文本型 / 字节集类”,内部把指针细节全部处理好。返回值=加密后的字节集,失败返回 空对象。
      // 注意:火山不支持参数默认值填负数,所以“密钥类型=-1(自动)”不能写进默认值,调用时请显式传 -1 或 0/1。
      变量 结果地址 <类型 = 变整数 值 = 0>
      变量 结果长度 <类型 = 整数 值 = 0>
      // 文本到多字节:转成本地多字节(ANSI/GBK)字节集,默认自带结束\0,等价于易语言把“文本型”参数传给 DLL 的行为。
      // 若你的 DLL 要 UTF-8,把下行改成 文本到UTF8 (密钥文本)。
      变量 密钥字节集 <类型 = 字节集类>
      密钥字节集 = 文本到多字节 (密钥文本)
      变量 状态码 <类型 = 整数>
      状态码 = RSA_加密 (取字节集指针 (密钥字节集), 密钥类型, 取字节集指针 (待加密数据), 取字节集长度 (待加密数据), 填充方式, 摘要算法, 取变量地址 (结果地址), 取变量地址 (结果长度))
      // 下面按你 DLL 的实际返回约定修改:这里假设返回 0 表示成功。
      如果 (状态码 == 0)
      {
            变量 输出 <类型 = 字节集类>
            输出 = 指针到字节集 (结果地址, 结果长度)// 把 DLL 返回的内存 Copy 成火山字节集使用
            // 注意:结果地址 处是 DLL 内部申请的内存,需要时用 DLL 提供的释放函数释放(若有 RSA_Free / Crypto_Free 之类请在此调用);测试阶段不释放也只是泄漏。
            返回 (输出)
      }
      返回 (空对象)
    }
}

类 启动类 <公开 基础类 = 程序类>
{
    方法 启动方法 <公开 类型 = 整数>
    {
      // ===== 测试示例 =====
      // 明文可以是任意字节集:这里用字符串演示,实际也可来自文件/网络/硬件。
      变量 明文 <类型 = 字节集类>
      明文 = 文本到多字节 ("Hello RSA 测试123")
      // 示例:用公钥(0) + PKCS#1 v1.5(0) + SHA256(2) 加密
      变量 密文 <类型 = 字节集类>
      密文 = RSA加解密.加密 ("-----BEGIN PUBLIC KEY-----你的公钥-----END PUBLIC KEY-----", 0, 明文, 0, 2)
      如果 (密文 != 空对象)
      {
            全局信息框 ("加密成功,密文长度 = " + 到文本 (取字节集长度 (密文)) + " 字节", 0, "RSA测试")
      }
      否则
      {
            全局信息框 ("加密失败(检查 DLL 路径、密钥、参数约定)", 0, "RSA测试")
      }
      返回 (0)
    }

    #
}
页: [1]
查看完整版本: 调用外部DLL问题