PB 電子会議室
発言No. | 更新日 | 題名(クリックすると発言内容と関連するコメントが表示されます) |
---|---|---|
16189 | 01/09/05 13:29:11 | RE(1):外部関数の引数:構造体メンバにstring型の配列 By ryochan |
16184 | 01/09/04 16:15:09 | 外部関数の引数:構造体メンバにstring型の配列 By ykano |
カテゴリ:スクリプトの記述
日付:2001年09月05日 13:29 発信者:ryochan
題名:RE(1):外部関数の引数:構造体メンバにstring型の配列
ykanoさん、こんにちは。
>>long _stdcall test1(sequence_string *p_test1)
>{
> char dbgbuf[2560];
>
> memset(dbgbuf, 0, sizeof(dbgbuf));
> sprintf(dbgbuf, \"[%d][%d][%d]\",
> strlen(p_test1->_buffer), strlen((p_test1->_buffer)+1), strlen((p_test1->_buffer)+2));
> MessageBox(NULL, dbgbuf, \"test1引数:AAD_SEQ_IN_REC SIZE\", MB_OK);
> return(0);
>}
ポインタ配列なので、ポインタをシフトした後、
そのポインタに格納されている実体を指し示す
アドレス値を読むようにしなければいけません。
よって
strlen( (char *)*(p_test->_buffer + 1) )
となります。
MessageBox(NULL,(char *)*p_test->_buffer,\"1st Value\",MB_OK);
MessageBox(NULL,(char *)*(p_test->_buffer + 1),\"2nd Value\",MB_OK);
で正常に出力されると思います。
typedef struct {
unsigned long _maximum;
unsigned long _length;
char *_buffer[];
} sequence_string;
コンパイラオプションは、#16178と同じ様に
/Zp4なのですよね。
構造体のメンバはすべて4バイト(32bit)
のため、PB側でdummyによる調整を行う必要は
無いと思います。
さらにダブルポインタで行う(char **_buffer)には、
(面倒ですが、本当はこちらが標準的かな)
ダブルポインタメンバ変数に対する
PB側での構造体のメンバ変数の型を
(unsingned)long型で宣言し、
lstrcpynA APIを利用して、その戻り値
であるポインタを格納させて、
DLL関数に引き渡します。
FUNCTION ULong lstrcpyn(ref string dst[], ref string src[], UnsignedLong length) &
Library \"kernel32.DLL\" Alias for \"lstrcpynA\"
str_seqstr lstr_seqstr
string buff[]
buff[1] = \"aaa\"
buff[2] = \"bbbb\"
buff[3] = \"ccccc\"
lstr_seqstr.maxmum = 5
lstr_seqstr.length = 5
lstr_seqstr.buffer = lstrcpyn(buff,buff,0)
test1(lstr_seqstr)
あとは
上記のCのコードでOKだと思います。
付加情報:
PowerBuilder Version (記載なし)
Client SoftWare
OS Windows95
DBMS (記載なし)
Browser (記載なし)
Server SoftWare
OS (記載なし)
DBMS (記載なし)
WebServer (記載なし)
Copyright © 2013 Power Future Co., Ltd.