2009-04-23 13 views
1

私はWindows上でRuby 1.8.6を使用しています。私はRubyをC言語で拡張しています。つまり、DLLをRubyにロードしたいのです。しかし、Rubyは私のDLLをロードできません。私はVisual Studio.netのコマンドプロンプトを使用して、私のDLL、すなわちprov.dllをCプログラムpro1.c.に統合します。その後、私はRubyを通してこれらのC関数を呼び出します。RubyがDLLをロードできない

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); 
} 

答えて

0

それがあなたのRubyコードでPro::loadの戻り値を決定する何のようですので、私は、pro_load()の定義を見てしまいます。

関連する問題