RubyでWin32APIを使用してDLLの関数を利用したいのですが、構造体のやりとりについて、pack,unpackの使い方がよくわからないので、易しく説明しているページを探しています。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:hmom No.1

回答回数46ベストアンサー獲得回数0

ポイント50pt

http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=pack%A5%...

packテンプレート文字列 - Rubyリファレンスマニュアル

sockaddr_in 構造体の例が下の方にあります。

id:Rynan

具体的にはVBで言うところの以下の関数を使おうとしてるのですが、どうやってやったらよいかわかりません。

Type sockaddr_in

sin_family As Integer

sin_port As Integer

sin_addr As Long

sin_zero As String * 8

End Type

Type ncb_t

sin As sockaddr_in

so As Long

nPipe As Long

context As Long

cursor As Long

hmem As Long

log_flag As Integer

hlib As Long

fTread As Long

emp_attr_ptr As Long

emp_top_ptr As Long

End Type

’ サーバをオープンする

Public Declare Function qwm_open& Lib ”empnt32.dll” (ncb As ncb_t, ByVal host$, ByVal serv$, ByVal Login$, ByVal PASSWD$)

------------------------------------------------------

qwm_open(ncb ,host ,serv ,login ,passwd) As Integer

ncb As ncb_t

ByVal host As String

ByVal serv As String

ByVal login As String

ByVal passwd As String

----------------------------------------------

2004/12/04 17:42:22
id:zizz_walla No.2

回答回数121ベストアンサー獲得回数0

ポイント200pt

http://www4.big.or.jp/~rynan/wiki/wiki.cgi?page=Ruby%2FEMPRESS+S...

Ruby/EMPRESS SQL Client - 喫茶『かくれ家』

ncb_t は、構造体の中に構造体を持っています。

メモリ上では以下のように配置されます。

  Type ncb_t

   Type sockaddr_in

s    sin_family As Integer

s    sin_port As Integer

l    sin_addr As Long

A8   sin_zero As String * 8

   End Type

l   so As Long

l   nPipe As Long

l   context As Long

l   cursor As Long

l   hmem As Long

s   log_flag As Integer

l   hlib As Long

l   fTread As Long

l   emp_attr_ptr As Long

l   emp_top_ptr As Long

  End Type

左側の sとかlとかAは、テンプレート文字です。

s は Integer、l は Long、A は String のテンプレート文字です。

これをunpackテンプレート文字列にするには上からつなげていきます。

 ”sslA8lllllsllll”

連続するテンプレート文字は、後に回数指定をつけて簡略化できますので

 ”s2lA8l5sl4”

になります。

packテンプレート文字列も同様に ”s2la8l5sl4” になります。

pack と unpack で A8 と a8 が違っています。

pack の場合は、8文字に満たない場合、¥0 にしたいためです。

id:Rynan

どうも詳しい解説ありがとうございます。

実は既に試行錯誤して解決してました(^^;

質問を終了するのを忘れていました、申し訳ありません。

ちなみに、紹介して頂いたページも私のページです。

本当に、どうもありがとうございした。

2004/12/20 19:40:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません