Input # でBytePtr変数への読み込み

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
yama
記事: 58
登録日時: 2005年5月31日(火) 21:11
お住まい: 新潟市
連絡する:

Input # でBytePtr変数への読み込み

#1 投稿記事 by yama »

プログラミング質問板
http://www.discoversoft.net/forum/viewtopic.php?t=822
のスレッドにあるyu0627さんの投稿をもとにメールソフトの題名の
日本語化を試しました。各情報を設定ファイルとして保存取り込み
しようとして以下のようにしましたが、BytePtrの変数への読み込み
がうまく行きません。

コード: 全て選択


'グローバルな定数宣言
    Dim szServerName[255] As Byte      'サーバー名
    Dim szFrom[255] As Byte            '送信元アドレス
    Dim szFromName As BytePtr          '送信元名
    Dim szTo[255] As Byte              '送信先アドレス
    Dim szToName As BytePtr            '送信先名
    Dim szSubject As BytePtr           '件名

Sub f_read()
'ファイルの読み込み
	Dim FilePath[255] As Byte
	DIM s_damy As String                 '文字ダミー
	DIM dat_f_name As String             '読み込みdat 拡張子付
	dat_f_name ="ini.DAT"
Open dat_f_name For Input As #1

	Input #1, s_damy,s_damy	
		lstrcpy(szServerName,s_damy)	'サーバー名
	Input #1, s_damy,s_damy	
		lstrcpy(szFrom,s_damy)			'送信元アドレス
	Input #1, s_damy,s_damy
lstrcpy(FilePath,s_damy)
		szFromName=FilePath		'送信元名
	Input #1, s_damy,s_damy
		lstrcpy(szTo,s_damy)			'送信先アドレス
	Input #1, s_damy,s_damy
lstrcpy(FilePath,s_damy)
		szToName=FilePath		'送信先名
'ダミーで受けて各変数に取り込み
close #1
End Sub
始めは input でじかに変数に受けてみましたが取り込めませんでした。
上記lstrcpyではデバッグ窓で変数には意図した文字が入っていますが
エディットボックスへの表示が意味不明となります。
ポインタのあたり理屈が良くわかってないのです。よろしくお願いします。
たかせ
記事: 217
登録日時: 2006年2月05日(日) 17:10
お住まい: 東京都

Input # でBytePtr変数への読み込み

#2 投稿記事 by たかせ »

たかせです。
はじめまして。

string型をbyte型のデータにcopyしてみてはどうでしょうか?
最後に編集したユーザー たかせ [ 2006年4月01日(土) 16:57 ], 累計 1 回
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

Re: Input # でBytePtr変数への読み込み

#3 投稿記事 by Sinryow »

ポインタというのは,この例であれば,文字列そのものではなく「文字列がある場所」を示します。

「szFromName=FilePath」というのは,「szFromNameが,FilePathのある場所と同じ場所を指すようにせよ」という意味なのですが(szToNameも同様),FilePathはf_read中のローカルな変数なので,f_read関数を抜けてしまうとその値が保持されなくなるのです。

この場合,szFromName,szToNameもBytePtrからByte[255]にしてlstrcpyを使ったほうがよいかと思います。

<余談>
・・・とか言いつつ,文字列バッファのサイズを255に割り切ってしまうのはセキュリティ上問題があります。
●malloc/freeを用いる
●lstrcpynを使って,文字列を255byteまでしか指定できなくする
●あるいは思い切って全部Stringにしてしまう
ということを考えたほうがよいでしょう。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
yama
記事: 58
登録日時: 2005年5月31日(火) 21:11
お住まい: 新潟市
連絡する:

なんとか思うように読み込めそうです

#4 投稿記事 by yama »

たかせさんご返信ありがとうございました

頭を整理するため該当部分を切り出していろいろ試してみました。
Input #でString型に受けてlstrcpyでByte配列にコピーしBytePtr型に渡す。
わかったことはInput #はString型で受けなければいけないということ。
Sinryowさんこんにちは
yu0627さんが拡張された題名の日本語化のコード内でszFromName,szToNameが
変数をBytePtrである必要があるようで、(拡張部分のコードを理解し切れて
いないのですが)いままで前半のコメントアウト部のようにStringを使用した方法を
つかって、Byte配列やBytePtr型は避けて通っていたので今回勉強になりました。

上記の検証をうけてメールソフトの方をこれからまたいじってみます。お二方とも
ありがとうございました。
返信する