- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
问题:
我想在我的 Ruby 程序中使用一种用 C 编码并通过 DLL 公开的算法。
我想将该算法视为一个黑盒,我可以从 Ruby 中调用它——只需传入所需的参数并使用结果即可。
Ruby(1.8.7 和 1.9.3)都有 Win32API
模块,它似乎旨在使与动态库的接口(interface)变得非常容易,以完成我想要的事情。
但问题是我似乎无法调用 Win32API 来发回字符串。
详细信息:
第三方C函数是CodeGen()
。它有 6 个参数,包括一个源字符串、一个用作加密 key 的任意字符串,以及为简单起见的 4 个数值参数,一个 signed int、一个 unsigned long 和两个 unsigned short。根据这些,CodeGen() 实现黑盒算法以返回结果字符串。
CodeGen() 的 C 原型(prototype)是:
const char *CodeGen( int encryp_level,
const char *source_str, const char *encryp_key,
unsigned long param_a,
unsigned short param_b, unsigned short param_c
)
请注意,两个输入字符串都是常量,即它们作为字符串提供给 CodeGen()——因此指向常量字符串的指针
CodeGen() 的返回值也是一个字符串,具有固定的最大长度,因此它将返回一个指针。
我的问题:
如何设置对 CodeGen() 的调用并取回它应该生成的字符串?
我的尝试:
当我期望获得一个字符串时,下面的代码只是简单地将整数作为返回值。
require 'Win32API'
codeGen = Win32API.new("encrypt.dll", "CodeGen", "ISSIII", "S")
ret_str = codeGen.Call(3, "foo", "bar", 0, 0, 0)
puts ret_str
但是,我得到的不是一个字符串,而是一个整数。 编辑:这会是一个指针吗?
虽然我在 Windows 7 64 位版本上使用 Ruby 1.9.3,但我还在 Windows XP 32 位上使用 Ruby 1.8.7 测试了上述内容,所以我很确定它是与我使用 Win32API 本身有关。
不确定问题是否出在以下任何一个:
任何见解将不胜感激!
最佳答案
虽然我不知道为什么 Win32API
方法不起作用,但我找到了一个更简单的解决方案,使用 FFI
来解决从 Ruby 中调用 C 函数的问题或与 DLL 接口(interface)。
使用FFI
的解决方案
在 Ruby 中使用 FFI
与 DLL 接口(interface),如下所示:
(1) 安装 ffi
(适用于 ruby 1.9.3,ymmv 适用于以前的版本)
gem 安装 ffi
(2) 创建自己的 Ruby 模块来包装 C 函数
require 'ffi'
module CodeGen # Ruby wrapper (your choice)
extend FFI::Library
ffi_lib 'codegen' # DLL name (given)
attach_function
:create_code, # method name (your choice)
:CreateCodeShort3, # DLL function name (given)
[ :int, :string, :string, :uint, :ushort, :ushort], :string
# specify C param / return value types
end
ret_str = CodeGen.create_code(3, "foo", "bar", 0,0,0)
puts ret_str
完成!
关于从 Ruby 中调用 C 代码——如何使用返回的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14168829/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!