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 (記載なし)

PowerSpaceの運営は、パワーフューチャー株式会社が行っております。
Copyright © 2013 Power Future Co., Ltd.