たむらです。
とりあえず、動くものが出来ましたので報告します。
http://www6.tok2.com/home/tamura/ruby/rbib03-cygbin00.zip
経過と問題点の報告。以降は、ruby-ext でやりましょう。
■Cygwin on Teraterm 問題
普段は、teraterm via ssh で cygwin 環境を利用しているのですが、
ふと cygwinコンソール(cmd.exe)で試すと、動きました。
# ちょっと私の環境が不安定なのかもしれない。Ruby/SDL も require で
落ちるし
■isc_expand_dpb() でエラーになる問題
なかださんから指摘があったように、APIリファレンスガイドに
『Windows 95 およびWindows NT では,引数の個数が固定されている関数
には,常に標準呼び出し規約(_stdcall)を使用します。引数の個数が
可変の関数はisc_start_transaction(),
isc_expand_dpb(),isc_event_block() の3 つだけです。これらにはcdecl
規約を使用します。』
とありました。いままでの所インポートライブラリの作り方の問題か
BCC以外では動いてません。
■export問題
Borland C++ Compiler 5.5 (BCC)にて、interbase.c をいぢらずに、
interbase.so でシンボルをエクスポートする方法が判らなかったので、
ソースをいぢりました。
# しかし今回DLLの作り方とか、呼び出し規約とか、いろいろ勉強になった。
# なかださん、いつもありがとうございます。
オプションとかで対応できると思われるのですが、vc++でのオプションをどなたか
教えていただけませんか。
((* ruby.h は触らずに、-Dinline指定で大丈夫になりました。*))
■GC 問題
スクリプト内の require 直後に、GC.start しとかないとスクリプト終了時の
conn_free()内の free()で SEGV ります。
Init_interbase() にアヤシそうな所もないのですが。
[ruby-ext:00349] Re: Ruby/Gtk + Imlib patch
を参考に、Init_interbase()の最後に、rb_gc() を追加してます。
[ruby-ext:00439] Data struct, including VALUE type variable
[ruby-ext:00445] ruby-xlib-0.5 released
辺りを見ると、「VALUE 型を含む構造体を Data Struct として使うべきでない」
とのことですけど、どうしましょう。
--- interbase.c Fri Jul 13 20:25:52 2001
+++ ../interbase.c Fri Feb 4 17:12:42 2000
@@ -1540,14 +1540,7 @@
return rb_iv_get(err, "error_code");
}
-#if defined(__BORLANDC__)
-#ifdef __cplusplus
-extern "C" {
-#endif
-void __declspec(dllexport) __stdcall
-#else
void
-#endif
Init_interbase()
{
rb_mInterBase = rb_define_module("InterBase");
@@ -1580,6 +1573,4 @@
rb_eIBerror = rb_define_class_under(rb_mInterBase, "Error", rb_eStandardError);
rb_define_method(rb_eIBerror, "error_code", iberr_err_code, 0);
-
- rb_gc();
}
[make.bcc]
## Makefile for Ruby/InterBase for BCC55 with ruby 1.6.4 (2001-06-04) [i686-cygwin]
##
SHELL = /bin/sh
#### Start of system configuration section. ####
## implib -a cygwin-ruby16.lib cygwin-ruby16.dll
## implib gds32.lib gds32.dll
##
srcdir = e:\tamura\src\CYGWIN\ruby-1.6.4
topdir = $(srcdir)
hdrdir = $(srcdir)
VPATH = $(srcdir)
CC = bcc32 -W -w-ifr -w-pro -Dinline
LINK = ilink32
CFLAGS = -DUSEIMPORTLIB -DWIN32 -D__CYGWIN__
CPPFLAGS = -I$(hdrdir) -I..\include
CXXFLAGS = $(CFLAGS)
DLDFLAGS =
LDSHARED = $(LINK) /Tpd $? c0d32.obj
BCC_LIBS = import32.lib cw32mt.lib
LIBPATH =
RUBY_INSTALL_NAME = ruby
RUBY_SO_NAME = cygwin-ruby16.lib
#### End of system configuration section. ####
LOCAL_LIBS = GDS32.lib #$(TARGET).lib
LIBS = $(RUBY_SO_NAME)
OBJS = interbase.obj
TARGET = interbase
DLLIB = $(TARGET).so
RUBY = ruby
RM = $(RUBY) -r ftools -e 'File::rm_f(*Dir[ARGV.join(" ")])'
EXEEXT = .exe
.SUFFIXES : .obj .c
.SUFFIXES : .res .rc
all: $(DLLIB)
clean:
$(RM) *.obj *.so # $(TARGET).def $(TARGET).lib
.c.obj:
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
$(DLLIB): $(OBJS) $(LOCAL_LIBS)
$(LDSHARED) $(DLDFLAGS) ,$(DLLIB), ,$(BCC_LIBS) $(LIBS)# ,$(TARGET).def
[test.rb]
#!/usr/local/bin/ruby
require 'interbase'
#GC.start
conn = InterBase::connect(
'test.gdb', 'test','test')
conn.execute('SELECT * FROM BAR').each do |r|
puts r.join('|')
end
conn.commit
conn.close