PB 電子会議室
発言No. | 更新日 | 題名(クリックすると発言内容と関連するコメントが表示されます) |
---|---|---|
12894 | 00/08/23 10:39:28 | RE(4):PB6.5: ファイルのフルパスを取得したい By nobuyan |
12889 | 00/08/22 22:50:54 | RE(3):PB6.5: ファイルのフルパスを取得したい By あすかちゃんの父 |
12884 | 00/08/22 18:33:03 | RE(2):PB6.5: ファイルのフルパスを取得したい By nobuyan |
12878 | 00/08/22 14:48:38 | RE(1):PB6.5: ファイルのフルパスを取得したい By ryochan |
12868 | 00/08/21 21:45:45 | PB6.5: ファイルのフルパスを取得したい By nobuyan |
カテゴリ:スクリプトの記述
日付:2000年08月22日 22:50 発信者:あすかちゃんの父
題名:RE(3):PB6.5: ファイルのフルパスを取得したい
nobuyanさん、こんばんは。
>また、refとするのはどういったときでしょうか?
>今回はAPI関数の本でByValとある部分をrefにしたのですが・・・。
ByValということはAPI関数の本はVB用ですね?
VBのAPI宣言をPBに流用する場合、注意が必要です。
まずPBの外部関数宣言でrefの意味は参照渡しのことで、DLLの関数
が変数の格納されているメモリのポインタを要求する場合に、ref
キーワードをつけてポインタをDLLに渡します。
PBの場合、変数宣言部に何もつけなければ値渡しとなり、変数のデ
ータの値がDLLに渡されます。
これに対してVBは外部関数宣言で何も付けなければ、参照渡しとな
り、値渡ししたい場合は、ByValのキーワードを付けます。PBと逆
ですね。
しかしVBの場合これに例外があります。
VBの外部関数宣言を複雑にしている問題は、文字列データの扱いに
関するものです。
多くの文字列を扱うDLLはANSI文字列のLPSTRと呼ばれるデータ型を
要求し、C言語やPBではANSI文字列が標準です。これに対してVBは内
部で取り扱う文字列データはUnicodeのBSTRと呼ばれるデータ型とな
っています。
つまりVBはWindowsのDLLと文字列データの互換性が無いのです。
VBはこの問題をクリアするために、DLLを呼び出すときに一時的な
ANSI文字列のバッファを作成します。
BSTRの先頭にはこのANSI文字列のバッファのポインタが格納されてお
り、「ByVal lpsName As String」と宣言すると実際にDLLに渡され
るのはANSI文字列データのバッファのポインタアドレスが渡されるた
め、ByValとしながら実際には参照渡しとなっています。
PBで外部関数の宣言を定義する場合は、VBの宣言を流用する場合は
こういった注意が必要なため、PBと互換性のあるC言語用のWin32SDK
等を使うほうがいいと思います。
付加情報:
PowerBuilder Version (記載なし)
Client SoftWare
OS Windows NT 4.0
DBMS Oracle SQL*Net 8
Browser InternetExplorer5.X
Server SoftWare
OS (記載なし)
DBMS (記載なし)
WebServer (記載なし)
Copyright © 2013 Power Future Co., Ltd.