PB 電子会議室
カテゴリ:PowerBuilderの開発環境
日付:2000年09月04日 12:34 発信者:ryochan
題名:RE(15):PB6.5: win32 API関数の使用方法について→PBでのポインタの使用:その2
...続き
構造体については、もう少し追求しようとテストしてみました。
例えばこんな感じです。
実験1
・構造体のポインタを引数にもつDLL関数がある(作成する)。
・その構造体のメンバの型がwchar_tで、DLL関数内で値がセットされる。
PBでは
・構造体のメンバはstring型で宣言する。
・外部関数の引数でref 構造体と宣言する。
PB側で、メンバに変数について領域を確保し
そのDLL関数をPBから実行すると、正常にPB側で構造体のメンバ変数
に値が格納されている。
>APIには構造体のアドレスを渡すだけなので、
>各メンバ変数がさらにポインタ変換されることはないはずです。
これは、構造体のメンバは値渡しであることをおっしゃっているのですよね。
となると、これと矛盾し、メンバも参照渡し(ポインタ変換)
されているとしか思えないのですが...?
ではさらに、Takaさんがおっしゃった
FILEOPENNAMEのメンバ変数が値渡しであるということを確認するために
実験2
前回の発言のGetCurrentDirectoryAについて
バッファアドレスを格納したlong変数について
ref宣言で呼び出してしまうと、Win98ではGPFが発生してし、
当たり前ですが、やはりうまくいきませんでした。
このような方法は値渡しでないとうまく
いかないということになります。
結果をまとめると、
今回のFILEOPENNAME構造体の場合は、メンバ変数は値渡し、
私がテストで作成した構造体の場合は、メンバ変数は参照渡し
となります。
以上より、
構造体のメンバについて、
・DLL側がポインタ型の場合はそのまま値渡し
・DLL側がポインタ以外の場合は参照渡し
ということになります。
この考察について、意見がある場合は宜しくお願いします。
付加情報:
PowerBuilder Version (記載なし)
Client SoftWare
OS Windows NT 4.0
DBMS Oracle SQL*Net 8
Browser (記載なし)
Server SoftWare
OS (記載なし)
DBMS Oracle 8.0
WebServer (記載なし)
Copyright © 2013 Power Future Co., Ltd.