Top Page > C++ Builder��Ruby�̊g�����W���[�������


C++ Builder��Ruby�̊g�����W���[�������


����ʓI�Șb

Ruby�̋@�\���g�����邽�߂�C/C++�Ȃǂŏ����ꂽ���C�u�������g�����W���[���ƌ����܂��BWindows�ł́A���̎��̂�DLL�ł��B

�g�����W���[���̏������́ARuby�� doc/ruby/ruby-1.6.7/README.EXT.ja �ɏڂ���������Ă��܂��BRuby/KAKASI�g�����W���[���̃y�[�W�ɂ́A�g�����W���[���̃T���v���R�[�h�Ɖ�����L���āA�𗧂��܂��B

���͂��߂�

BCB6 Pro���ɐ������܂��B�ȉ��̐����́A�u����������炤�܂����������ۂ��v�Ƃ��������ŁA�����������Ȃ̂��͕�����܂���B�����Ԉ���Ă���A�����ƊȒP�ȕ��@���L������w�E���Ă��������B

��BCB��DLL�̃v���W�F�N�g�����

���ʂɍ��܂��B�O�̂��ߐ�������ƁA

��ruby.h ���C���N���[�h

ruby.h ���C���N���[�h���܂��B ruby.h �Ɗ֘A�w�b�_�t�@�C����Ruby�� lib/ruby/1.6/i586-mswin32 �ɗL��܂��B

��mswin32-ruby16.lib ���v���W�F�N�g�ɒlj�

mswin32-ruby16.lib ���v���W�F�N�g�ɒlj�����K�v���L��܂��Bmingw�Ńo�C�i���ł� lib �f�B���N�g���ɓ����Ă܂����A����́i�����jVC�p�Ȃ̂ŁA���̂܂܂ł͎g���܂���B�R�}���h�v�����v�g��

coff2omf mswin32-ruby16.lib mswin32-ruby16-bcb.lib

�Ƃ���BCC��Lib�t�@�C�������A������v���W�F�N�g�ɒlj����܂��傤�B�‚��łɁARuby�� bin �f�B���N�g���� mswin32-ruby16.dll ��System�f�B���N�g���ɃR�s�[���Ă����܂��傤�B

���K�v�Ȋ֐����`����

Ruby/KAKASI�g�����W���[���Ȃǂ�����Ε�����悤�ɁA Init_dlltest �idlltest �̏��̓v���W�F�N�g���j�Ȃǂ̊֐����`���܂��BC++�ŏ����Ă�ꍇ�́A

extern "C"{
�@void Init_dlltest();
}

�̂悤�ɁA�֐��錾�� extern "C"{ �c } �ň݂͂܂��B�֐���`���͂ޕK�v�͖����ł��B���̕ӂ̊֐��̏������ɂ‚��ďڂ����� README.EXT.ja ��ǂ�ł��������B

���֐����G�N�X�|�[�g����

���ʂȂ�A�֐��� __export �� __declspec(dllexport) ��t����΃G�N�X�|�[�g�����I�Ȃ�ł����A���ꂾ�ƗႦ�� _Init_dlltest �̂悤�ɁA�G�N�X�|�[�g���ꂽ�֐����̐擪�ɃA���_�X�R�A���t�����Ⴄ��ł��ˁB�ŁA���ꂾ��Ruby�����܂��Ăяo���Ȃ��悤�ł��B�����Łu���W���[����`�t�@�C���v���Ă̂����܂��B

CODEPRELOAD MOVEABLE DISCARDABLE
DATAPRELOAD MOVEABLE SINGLE
HEAPSIZE4096
STACKSIZE1048576
EXPORTS
�@�@Init_dlltest=_Init_dlltest

����ȕ��ɏ��������̂��A dlltest.def �Ƃ��� dlltest.bpr �Ɠ����f�B���N�g���ɕۑ����܂��B�Ō�̍s���A�u������ _Init_dlltest �̊֐��� Init_dlltest �Ƃ������O�ŃG�N�X�|�[�g�v�ƌ����Ӗ��Ȗ�ł��ˁB�ŁA[�v���W�F�N�g]-[�I�v�V�����\�[�X�̕ҏW]��

<DEFFILE value=""/>

�Ƃ�������

<DEFFILE value="dlltest.def"/>

�ɏ��������܂��B����Ń��C�N����΁A Init_dlltest �Ƃ����֐����G�N�X�|�[�g���ꂽ dlltest.dll ���ł��܂��B eXeScope �Ȃǂ̃c�[���Ŋm�F�ł��܂��B���Ȃ݂ɁA rb_define_module_function �Ȃǂœo�^�����֐����G�N�X�|�[�g����K�v�͖����悤�ł��B

������1�����ӓ_�BBCB6�̃o�O�Ȃ̂��A�I�v�V�����\�[�X��DEFFILE�̐ݒ�́A�v���W�F�N�g���J���Ȃ����ƃN���A����Ă��܂��܂��B���C�N����O�Ɉ�U dlltest.bpr.xml �̃^�u��‚��ĊJ���Ȃ����ADEFFILE�̐ݒ肪�N���A����Ă���Ώ��������܂��傤�B*1

��Ruby����g��

Ruby�t�@�C����

require 'dlltest'

�Ƃ���΁A�Ȍ�A dlltest.dll �Œ�`�������W���[����N���X���g���܂��B dlltest.dll ��Ruby�t�@�C���Ɠ����f�B���N�g�����ASystem�f�B���N�g���ӂ�ɒu���܂��傤�B

Ruby�� require '***' ��DLL�� Init_*** �֐��ŁA***�̕����i�����ł�"dlltest"�j�̑�E���������Ⴄ�Ǝ��s���܂��B�������ő�����̂�������ł��B

���T���v��

--- dlltest_main.cpp ---

#include <windows.h>
#pragma hdrstop
#include <iostream>
#include <ruby.h>
using namespace std;
�@
extern "C"{
�@void Init_dlltest();
�@VALUE rb_DllTest_hello(VALUE obj);
}
�@
void Init_dlltest()
{
�@VALUE module= rb_define_module("DllTest");
�@rb_define_module_function(module, "hello", (VALUE (*)(...))rb_DllTest_hello, 0);
}
�@
VALUE rb_DllTest_hello(VALUE obj)
{
�@cout << "Hello world." << endl;
�@return INT2NUM(0);
}
�@
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
�@return 1;
}

--- test.rb ---

require 'dlltest'
DllTest.hello()


*1�@����DEFFILE�����������̂����������́A[�v���W�F�N�g]-[���C�N�t�@�C���̍쐬]�Ń��C�N�t�@�C���i��Fdlltest.mak�j���쐬���܂��傤�B�R�}���h�v�����v�g��
make -fdlltest.mak
�Ƃ���ƁA�����‹����g�킸��DLL�����C�N�ł��܂��B���������̏ꍇ�A�t�@�C���̒lj��Ȃǂ̂��߂ɂ͎蓮�Ń��C�N�t�@�C����������K�v���L��܂��B


Gimite �s���@<gimite@mx12.freecom.ne.jp>


C++ Builder��Ruby�̊g�����W���[������� < Top Page