c - Ruby 无法加载 DLL

标签 c ruby

我在 Windows 上使用 Ruby 1.8.6。我正在用 C 扩展 Ruby,也就是说我想将一个 DLL 加载到 Ruby 中。但是 Ruby 无法加载我的 Dll。我使用 Visual Studio.net 命令提示符并将我的 DLL(即 prov.dll)集成到 C 程序 pro1.c 中。之后,我通过 Ruby 调用那些 C 函数。

D:\ruby_extend\pronmake>irb
irb(main):001:0> require 'pro1'
=> true
irb(main):002:0> include Pro
=> Object
irb(main):003:0> Pro::load
=> false
irb(main):004:0> 

我只得到一个错误:

DLL fails to load through ruby...

如何获取堆栈跟踪?任何建议都会帮助我。

下面是我的 pro1.c 代码:

#include "windows.h"
#include "ruby.h"
#include "pro.h"
#define _D(string) {OutputDebugString(string);}
VALUE Pro;
HINSTANCE hlibrary;

void _textline(const char *s, int len)
//************************************
{
    _D(s);
}

static VALUE p_load(VALUE self )
//******************************
{
       return pro_load();
}

static VALUE p_init(VALUE self)
//*****************************
{
    _D("-> init");
         pro_set_textline_callback(_textline);
    pro_renderInit();
}

static VALUE p_parse(VALUE self, VALUE string_to_parse)
//*****************************************************
{
    _D(StringValuePtr(string_to_parse));
    return pro_parse(StringValuePtr(string_to_parse));
}

void proeventcallback(proRenderEventType type, proRenderEventData data)
//************************************************************************
{
    switch(type){
        case proRenderEventDone:
            _D("-> cleanup");
            pro_renderCleanUp();
            //if (vWindow)
            //{
            //  SendMessage((HWND)NUM2INT(vWindow), WM_USER+2, 0, 0);
            //}
    }
}

static VALUE pro_render( VALUE self )
//**********************************
{
    _D("-> render");
    pro_set_renderevent_callback(proeventcallback);
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_ABOVE_NORMAL);
    pro_render(PRO_RENDERASYNC);
    return Qtrue;
}

void Init_pro1()
//***************
{
    pro = rb_define_module( "Pro" );
    rb_define_method(Pro, "load", p_load, 0);
    rb_define_method( Pro, "init_engine", p_init, 0 );
    rb_define_method(Pro, "parse", p_parse, 1);
    rb_define_method(Pro, "render", pr_render, 0);   
}

最佳答案

我会查看 pro_load() 的定义,因为它似乎决定了您的 ruby​​ 代码中 Pro::load 的返回值。

关于c - Ruby 无法加载 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/780391/

相关文章:

c - 如何限制子线程或子进程以限制在 C 中 fork

c - 打印出与原始十进制数相同的 double

c - 带有指向其他尚未声明的静态变量的指针的结构的静态初始化

ruby-on-rails - 为什么不 bundle 安装带有扩展名的本地 gem?

ruby-on-rails - 无法解释的 "can' t修改卡住对象”异常

MacOS 上的 Ruby/IRB 环境问题

ruby-on-rails - 如何在 rails 中组合 2 个数组,使得没有重复项

c - 使用链接时替换在单元测试中为结构体创建测试替身

c - 运行我的 C 程序时在 Linux 中出现段错误

ruby - 该 block 如何用于整数倍方法?