BytePtr型と文字列の違いを教えてください。

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
矢田裕康
記事: 13
登録日時: 2005年10月01日(土) 18:38

BytePtr型と文字列の違いを教えてください。

#1 投稿記事 by 矢田裕康 »

テキストファイル「test.txt」をBasic Promptに表示させる下のようなものを作ってみました。
メッセージボックスではうまく表示されるのに print buffer では数字が表示されるだけで駄目でした。
そこで Strjng型の変数を作って下のようにしたら表示できましたがこれでよいでしょうか?
MessageBox関数の第2パラメータの文字列とprint命令語の文字列との違いがわかりません。
#N88BASIC
Dim path[MAX_PATH] as Byte
Dim hFile as DWord
Dim FileSize As Long
Dim buffer as BytePtr
Dim dwAccessByte As DWord
Dim hWnd As DWord
dim strText as String '表示する文字列

hFile=CreateFile("test.txt",GENERIC_READ,0,ByVal 0,OPEN_EXISTING,0,0)
If hFile<>INVALID_HANDLE_VALUE Then
FileSize=GetFileSize(hFile,0)
buffer=malloc(FileSize+1)

ReadFile(hFile,buffer,FileSize,VarPtr(dwAccessByte),ByVal 0)
buffer[dwAccessByte]=0
CloseHandle(hFile)

'MessageBox(0,buffer,"ファイルの内容",MB_OK)

strText=buffer
print strText

free(buffer)
End If
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#2 投稿記事 by マティ »

ActiveBasicの文字列を扱う基本関数は、String型のみサポートしているようです。

String型は最初の4バイトを文字列の長さとして、データを保持するようです。
その為、StrPtr()関数で返すポインターは、String型の4byte目を返します。

コード: 全て選択


             ↓StrPtr()で参照する先頭アドレス(String型)
[0][1][2][3][4][5][6]
↑バッファー等をBytePtrで参照する際の先頭アドレス
残念ながら、バッファーを4バイト目から使用しても、変数の型チェックで
String型とAB判定が判断出来ない為、標準関数では表示できません。

MsgBoxはWinAPIなのでStrPtr()またはBytePtrで文字列を指定する必要があります。

ちょっと難しいでしょうか?
矢田裕康
記事: 13
登録日時: 2005年10月01日(土) 18:38

BytePtr型と文字列の違いを教えてください。

#3 投稿記事 by 矢田裕康 »

ありがとうございました。
アドレスの図はどこかで見たような気がします。なんとなく分かったような感じです。
 それから「strText=buffer」左辺と右辺の型が違うのですがこんなことをしていいですか?
(エラーにはなりませんでしたが)
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 by イグトランス »

問題ありません。BytePtrからStringへは自動的に変換されます。
ちなみにString型変数を経由せずともPrint MakeStr(buffer)としても文字列を表示させることができます。
矢田裕康
記事: 13
登録日時: 2005年10月01日(土) 18:38

BytePtr型と文字列の違いを教えてください。

#5 投稿記事 by 矢田裕康 »

重ね重ねご指導ありがとうございました。MakeStr こんな関数があったのですね。ヘルプで確認しました。閲覧して下る方が多いのには驚きました。今後ともよろしくお願いいたします。
返信する