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

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