调用外部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]