|
|
2014/10/6(Mon) 17:11:09|NO.65456
COM を使ってソフトを作ろうと考えています。
http://msdn.microsoft.com/en-us/library/dd374345(v=vs.85).aspx
の Syntax にある
>[in] REFGUID guidPositionType,
>[out] PROPVARIANT *pvPositionValue
は、#comfunc の説明にあるどの型を使用すれば良いか分かりません。
また、IMFPMediaPlayer インターフェースに詳しい人がいれば教えてくれると助かります。
|
|
2014/10/6(Mon) 20:48:38|NO.65463
>#comfunc の説明にあるどの型を使用すれば良いか分かりません。
この場合、
第1引数にはintあるいはvar
第2引数にはintあるいはvar
を指定すればよさそうです。
>IMFPMediaPlayer インターフェースに詳しい人がいれば
IMFPMediaPlayerインタフェースに詳しいわけではありませんが、
COMの扱い方とMSDNの読み方がある程度わかるので、
助けになれるかもしれません。
必要なら返事を下さい。
|
|
2014/10/6(Mon) 21:54:22|NO.65465
>tds12 さん
ありがとうございます!
#comfunc IMFPMediaPlayer_GetPosition 8 int, int
と記述したら、エラーは発生しなくなりましたが、正しく再生時間を取得できていないようです。
(返り値が 0 になってしまいます><)
ただ、IMFPMediaPlayer インターフェースは将来廃止される予定だそうです。
せっかくお答えしてもらいましたが、今後は IMFMediaSession を使っていきたいです。
もし良ければ、MSDN の読み方を教えてもらえるとありがたいです。
|
|
2014/10/6(Mon) 22:41:36|NO.65466
1つ目の引数の型はREFGUIDで、REFGUIDはGUID*です。
また、引数の一緒に[in]と書いてあるのでこちら側からWindows側へデータを渡すということを示しています。
ですから1つ目の引数はポインタで、そのポインタが指す先の大きさはGUID構造体の大きさ以上である必要があります。
GUID構造体は、 http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931(v=vs.85).aspxなどを見る感じだと
4+2+2+1*8=16なので、HSP上では引数の型をvarとして、自分で必要なだけメモリを確保して渡す必要があるでしょう。
2つ目の引数はPROPVARIANT*なのでポインタ(変数のメモリ上の場所)を渡す必要があります。
また、この引数は[out]なのでこのポインタを通してWindows側から実行結果を受け取ります。
このポインタが指す先のサイズ(PROPVARIANT構造体のサイズ)は
http://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspxなどを見て自力で計算するか、Cで printf(“%z”, sizeof PROPVARIANT); みたいなことをやって調べてください。
こちらも自分で必要なサイズの領域を確保する必要があります。
|
|
2014/10/7(Tue) 21:57:42|NO.65471
>huga さん
そういうことだったのですね。勉強になります!
今回の REFGUID は MFP_POSITIONTYPE_100NS が定義されていると書かれていますが、
これが、GUID となるのですか?
PROPVARIANT は変数を指定するということですか?
|
|
2014/10/7(Tue) 23:57:42|NO.65472
>もし良ければ、MSDN の読み方を教えてもらえるとありがたいです。
わかりました。
いつまでかかるかわかりませんが、気長にお願いします。
>正しく再生時間を取得できていないようです。 (返り値が 0 になってしまいます><)
どのようにしてこうなったのかはスクリプトがないのでわかりませんが、
COMでの戻り値の0は成功を意味します。
再生時間は、第2引数の示すアドレスの変数の示すアドレスに16バイトのデータがあります。
8バイト目から8バイトにわたって書き込まれています。
(8バイト目から4バイトに下位32ビット
12バイト目から4バイトに上位32ビット)
>今回の REFGUID は MFP_POSITIONTYPE_100NS が定義されていると書かれていますが、
>これが、GUID となるのですか?
MFP_POSITIONTYPE_100NSはGUIDです。
内容は
MFP_POSITIONTYPE_100NS = 0,0,0,0
で、これを第1引数にvarptrを使いアドレスを渡せばよさそうです。
実際のスクリプトはいつか投稿するかもしれません。
>PROPVARIANT は変数を指定するということですか?
受け取るデータがあるアドレスを、受け取る変数のアドレスを指定すればよさそうです。
winapi(dllやcom)について、ちょうどよい説明をするために
ヒラギノさんがどのあたりまでわかるか教えてください。
夜遅くなってしまったので、また。
|
|
2014/10/8(Wed) 21:31:13|NO.65480
>NO.65472
なぜか形が崩れてしまいました。
>実際のスクリプトはいつか投稿するかもしれません。
>今後は IMFMediaSession を使っていきたいです。
IMFMediaSessionを使用されるようですが作ってしまったので、
皆さん自由に使ってください。
//↓64ビット整数値変換モジュール
#module
//↓を参考にしました
//http://www.tvg.ne.jp/menyukko/cauldron/hmexcalc.html
#defcfunc i642str int lowint,int hiint
//64ビットの整数を文字列に変換
// lowint...下位32ビットを指定
// hiint...上位32ビットを指定
db = 1.0
lpoke db,0,lowint:lpoke db,4,hiint
return strf("%I64d",db)
#global
//↓MFStartup用定義
#define MF_SDK_VERSION 0x0002
#define MF_API_VERSION 0x0070
#define MF_VERSION (MF_SDK_VERSION << 16 | MF_API_VERSION)
#define MFSTARTUP_FULL 0
//↓MediaFoundationの開始および終了用関数の定義
#uselib "Mfplat.dll"
#func MFStartup "MFStartup" int,int
#func MFShutdown "MFShutdown"
//↓IMFPMediaPlayer取得用関数の定義
#uselib "Mfplay.dll"
#func MFPCreateMediaPlayer "MFPCreateMediaPlayer" wstr,int,int,int,int,int
//↓IMFPMediaPlayerインタフェイスの定義
#define IID_IMFPMediaPlayer "{A714590A-58AF-430a-85BF-44F5EC838D85}"
#usecom IMFPMediaPlayer IID_IMFPMediaPlayer "{}"
#comfunc IMFPMediaPlayer_Stop 5
#comfunc IMFPMediaPlayer_GetPosition 8 int,int
#comfunc IMFPMediaPlayer_Shutdown 38
//↓GUIDの定義
MFP_POSITIONTYPE_100NS = 0,0,0,0
//↓MediaFoundationの開始
MFStartup MF_VERSION,MFSTARTUP_FULL
//↓タイトルの設定
title "IMFPMediaPlayer_GetPosition test"
//↓終了処理の設定
onexit gosub *exit
//↓再生用ファイル選択
dialog "*",16,"全て"
fname = refstr
if stat == 0:/*MFの終了*/MFShutdown:end
//↓IMFPMediaPlayerの取得
pMediaPlayer = 0
MFPCreateMediaPlayer fname,1,0,0,hwnd,varptr(pMediaPlayer)
//↓失敗したら終了
if stat:MFShutdown:end
//↓COM型変数作成
newcom MediaPlayer,IMFPMediaPlayer,-1,pMediaPlayer
//↓しばらく待つ
wait 100
//↓位置を取得して4秒待ちを、5回繰り返す
repeat 5
//-------------------------------ここで位置を取得し表示
//↓PROPVARIANT用変数の初期化
pvPositionValue = 0,0,0,0
//↓位置取得
IMFPMediaPlayer_GetPosition MediaPlayer,varptr(MFP_POSITIONTYPE_100NS),varptr(pvPositionValue)
//エラーならループを抜ける
if stat < 0:break
//↓画面クリア
color 255,255,255:boxf:color 0,0,0:pos 0,0
//↓位置をナノ秒で表示
mes i642str(pvPositionValue.2,pvPositionValue.3) + "ns"
//-----------------------------------------------------
//↓時間待ち
wait 400
loop
//↓終了
gosub *exit
stop
*exit
//↓再生されているメディアを停止
IMFPMediaPlayer_Stop MediaPlayer
//↓MediaPlayerを切断
IMFPMediaPlayer_Shutdown MediaPlayer
//↓MediaPlayerを解放
delcom MediaPlayer
//↓MediaFoundationを切断
MFShutdown
//↓終了
end
return
IMFMediaSessionのほうはしばらく調べておきます。
>winapi(dllやcom)について、ちょうどよい説明をするために
>ヒラギノさんがどのあたりまでわかるか教えてください。
追加で、MSDNの読み方についてはどの程度話せばよいでしょうか。
MSDNのほうはこの答えをいただいてからにしたいと思います。
| |
|
2014/10/8(Wed) 22:20:40|NO.65481
>tds12 さん
お返事ありがとうございます。
dim Position, 100
MFPCreateMediaPlayer file, 1,0,0,hwnd,iMFPlayer
repeat
IMFPMediaPlayer_GetPosition iMFPlayer, MFP_POSITIONTYPE_100NS, Position
title ""+Position
wait 10
loop
こんな感じのスクリプトを書いたのですが、何を勘違いしたのか戻り値はマイナスになっていました。。。
>8バイト目から8バイトにわたって書き込まれています。
ここらへんは、初めて読む 486 という本を読んだことがあるので、
なんとなくですが、理解できます。
winapi の知識は皆無です。。。
HSP のモジュールのようなものですか?
tds12 さんのスクリプトを見て、少しは理解できた気がします;;
|
|
2014/10/10(Fri) 22:28:05|NO.65500
>こんな感じのスクリプト
IMFPMediaPlayer_GetPosition関数の引数はint,intでしょうか、var,varでしょうか。
この書き方だと、var,varで定義(宣言)すればよさそうです。
配列Positionは、添え字0から3までで十分だと思います。
Position(2)と(3)にまたがって、64ビット整数値で格納されています
(hspのintは32ビット)。
そのため、専用のモジュールで文字列に変換する必要があります。
>戻り値はマイナスになっていました
戻り値というのはstatではなく、Positionのことでしょうか。
statがマイナスになっているとしたら、
最初にGetPositionを呼ぶ前にしばらくwaitするとよいかもしれません。
Position(0)がマイナスになっているのだとしたら、
単に見る場所が違うのかもしれません。
実行することはできませんが、スクリプトのイメージとしては
//↓64ビット整数値変換モジュール
#module
//↓を参考にしました
//http://www.tvg.ne.jp/menyukko/cauldron/hmexcalc.html
#defcfunc i642str int lowint,int hiint
//64ビットの整数を文字列に変換
// lowint...下位32ビットを指定
// hiint...上位32ビットを指定
db = 1.0
lpoke db,0,lowint:lpoke db,4,hiint
return strf("%I64d",db)
#global
#comfunc IMFPMediaPlayer_GetPosition 8 var,var
MFP_POSITIONTYPE_100NS = 0,0,0,0
MFPCreateMediaPlayer file, 1,0,0,hwnd,iMFPlayer
wait 100
IMFPMediaPlayer_GetPosition iMFPlayer, MFP_POSITIONTYPE_100NS, Position
title i642str(Position(3),Position(4)) + "ns"
>winapi の知識は皆無です。。。
>HSP のモジュールのようなものですか?
確かにモジュールのようにたくさんの関数等が公開されています。
そしてhspからは
#uselib/#funcや#usecom/#comfuncのようにして
使えるようにします。
MSDNを読むためには、VisualStudioExpress(Desktop版)が便利(ほぼ必須)です。
キーワードの意味などを調べるために使うことができます。
http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-desktop
無料で使うことができますが
マイクロソフトアカウントでの登録が必要です。
| |
|
2014/10/11(Sat) 19:22:59|NO.65516
>tds12 さん
お返事ありがとうございます。
>そのため、専用のモジュールで文字列に変換する必要があります。
そうだったのですね。。。それが原因かもしれません。
ただ、相変わらず Position は 0 のままで、stat はマイナスになってしまいます。
>MSDNを読むためには、VisualStudioExpress(Desktop版)が便利(ほぼ必須)です。
早速入れてみます!
|
|
2014/10/13(Mon) 22:38:26|NO.65544
>ただ、相変わらず Position は 0 のままで、stat はマイナスになってしまいます。
そうですか。
もしかして↓のページのスクリプトを改造していますか。
http://codetter.com/?p=1096
もしそうでしたら、次のようにすると成功すると思います。
#comfunc IMFPMediaPlayer_FrameStep 6
の下に、
#comfunc IMFPMediaPlayer_GetPosition 8 var,var
を追加...
//↓64ビット整数値変換モジュール
#module
//↓を参考にしました
//http://www.tvg.ne.jp/menyukko/cauldron/hmexcalc.html
#defcfunc i642str int lowint,int hiint
//64ビットの整数を文字列に変換
// lowint...下位32ビットを指定
// hiint...上位32ビットを指定
db = 1.0
lpoke db,0,lowint:lpoke db,4,hiint
return strf("%I64d",db)
#global
をスクリプトの先頭部分に追加...
GUID_100NS = 0,0,0,0
を、最初のstopまでに追加...
objsize 100,24
の下に、
pos ginfo_winx-600,0
button gosub "GetPos",*lGPos
を追加...
*lGPos
position = 0,0,0,0
if LOADED : IMFPMediaPlayer_GetPosition iMFPlayer,GUID_100NS,position
title i642str(position.2,position.3)
return
を、スクリプトの最後尾に追加
すると実行できると思います。
>早速入れてみます!
キーワード調べに使うための準備について書きたいと思います。
インストールが完了している前提で話を進めます。
まず、VisualStudioを起動してください。
"スタートページ"の"開始"の"新しいプロジェクト..."を、クリックしてください。
"インストール済み"の"テンプレート"の"Visual C++"の"Win32プロジェクト"を選択し、
"名前(N)"の横のテキストボックスに"Keyword"のようにわかる名前を付けます。
この時、"場所(L)"のフォルダ内に保存されます。
次に、OKを押すと、ウィザードが表示されるので、"次へ>"を押し、
"アプリケーションの種類"は、"Windowsアプリケーション"
"追加のオプション"は、"空のプロジェクト"にチェックを入れ、
完了をクリックします。
最後に、"ソリューション エクスプローラー"の
"ソースファイル"の上で右クリックし、
"追加(D)"の"新しい項目(W)"をクリック...
"C++ファイル"を選択し、適当な名前を付けて"追加(A)"します。
これで、キーワード調べの準備ができました。
次回以降の起動時は、"最近使用したファイル"や
エクスプローラで"*.sln"ファイルを見つけてダブルクリックするなどして
開くことができます。
次回は、MessageBox関数を例にMSDNを読みたいと思います。
| |
|
2014/10/15(Wed) 22:02:06|NO.65566
>tds12 さん
遅くなりました;;
できました!ありがとうございます。
>キーワード調べに使うための準備について書きたいと思います。
なるほどです。とりあえずできました。
よろしくお願いします。
|
|
2014/10/26(Sun) 17:44:23|NO.65758
+大変遅くなりました。
すみません。
まず、名前がわかっている関数を調べるときは、
yahooなどで、
「{関数名} function windows msdn」
と検索します。
たいていの場合、トップにページが現れると思います。
MessageBox関数の場合、
「MessageBox function windows msdn」
と検索します。
ページを開くと、MessageBox関数の場合、
関数名(MessageBox) function
関数の説明(Displays amodal...)
↓関数の形
Syntax
c++
関数の戻り値の型(int) 関数の種類でほぼ無視(WINAPI) 関数名(MessgeBox)(
引数1のSAL(_In_opt_) 引数1の型(HWND) 引数1の名前(hWnd),
以下略
);
↓引数の説明
Parameters
引数1の名前(hWnd)[SALの内容(in, optional)]
Type:引数の型(HWND)
引数の説明
以下略
↓戻り値の説明
Return value
Type:戻り値の型(int)
戻り値の説明(If a message...)
Return code/value Description
-----------------------------------------
定数名(IDABORT) 説明(The Abort...)
数値(3)
-----------------------------------------
以下略
↓解説
Remarks
解説(The following...)
↓例
Example
例(In the...)
c++
C++のサンプルコード(int Display...)
↓要件
Requirements
Minimum supported client 最低限のクライアント向けOS(Windows...)[使えるアプリの種類(desktop...)]
----------------------------------------------------------------------------------------------------
Minimum supported server 最低限のサーバ向けOS(Windows...)[使えるアプリの種類(Desktop)]
----------------------------------------------------------------------------------------------------
Header ヘッダファイル名(Winuser.h)(include インクルードすべきヘッダファイル)
----------------------------------------------------------------------------------------------------
Library VCで使うライブラリ名(User32.lib)
----------------------------------------------------------------------------------------------------
DLL 関数が入っているDLL名(User32.dll)
----------------------------------------------------------------------------------------------------
Unicode and ANSI names 文字コードによる正確な関数名(MessageBoxW...)
----------------------------------------------------------------------------------------------------
↓また見なさい
See also
必要に応じてみるべきドキュメント
hspからの利用方法
・#uselibで
関数が入っているDLL名を指定する
・#funcで
(ANSI)と書いてあるほうの正確な関数名を指定する
・引数には基本的にsptrを引数の数だけ指定する
・具体的には
#uselib "user32.dll"
#func "MessageBoxA" sptr,sptr,sptr,sptr
とする。
引数や戻り値の型は
c言語の型か
http://msdn.microsoft.com/en-us/library/cc230309.aspxに書かれている
型になります。
SALとは
http://msdn.microsoft.com/ja-jp/library/hh916383.aspx
に書かれています。
英語の説明の雰囲気をとらえるためには
「Bingで翻訳」がお勧めです。
定数や変数の型は
前回インストールしたVisualStudioを起動して
キーワード用のプロジェクトを開き
調べたいキーワードを入力して
F12キーを押すと
定義が表示されます。
よくわからないところは
言っていただければ
説明できるかもしれません。
しばらく待ちます。
| |
|
2014/10/26(Sun) 21:00:29|NO.65761
>tds12 さん
なるほどです。
Syntax の UINT は、32ビット符号なし整数と書いてあるので int (?) を使えますが、
sptrと書いてあるのはなぜですか?
|
|
2014/10/26(Sun) 21:56:13|NO.65763
>sptrと書いてあるのはなぜですか?
第1引数や第4引数では、intにできますが、
第2・3引数では文字列を渡すためintでは使いにくく
説明を簡単にするためにsptrといいました。
実際のスクリプトでは
//int,int,int,intの場合
#uselib "user32.dll"
#func MessageBox "MessageBoxA" int,int,int,int
bodytext = "テキスト"
titletext = "タイトル"
MessageBox hwnd,varptr(bodytext),varptr(titletext),0
//sptr,sptr,sptr,sptr
#uselib "user32.dll"
#func MessageBox "MessageBoxA" sptr,sptr,sptr,sptr
MessageBox hwnd,"テキスト","タイトル",0
となり、sptrでは、32bit整数と文字列の両方を引数に直接指定できるため、
intでは3行かかるところが1行ですみます。
そのため、intではなく、sptrと説明しました。
|
|
2014/10/28(Tue) 23:10:34|NO.65791
>tds12 さん
そうだったのですね。ありがとうございます!
|
|
2014/11/18(Tue) 22:41:23|NO.66088
またまた、遅くなってしまいました。
すみません。
この後の説明で必要になってくるので、
「C言語 typedef」や
「C言語 構造体」等で
検索してみてください。
実際にmsdnを読んでいると
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646830(v=vs.85).aspx
のような文書がよく出てきます。
今回は、ポインタの簡単な扱い方について書こうと思います。
ポインタとは、示したいものの住所のようなもので、
hspでは、varptrやdupptrを使って扱います。
これを使うことで、大きな複数のデータのやり取りが可能になるなどします。
関数の説明などを読んでいると、
「型* 引数名」のようなものが見られますが、
これは「引数名が 型へのポインタを表す」という意味でとらえてよいと思います。
hspにおいて、変数へのポインタを取得するためにはvarptr関数を使い
//henという変数がある
hen = 5
//henptrはhenへのポインタ
henptr = varptr(hen)
のように使います。
ポインタを受け取るDLLの関数fがあるとすると
スクリプトは、
//ポインタ一つを引数に受け取る関数f
#uselib "DLLの名前"
#func f "f" int
//henの初期化
hen = "Hello"
//henへのポインタをfに渡す
f varptr(hen)
のようになると思います。
また、ptrが表わすint型変数へのポインタの中身を読み書きするためには
//henを初期化
hen = 5
//henのポインタを取得
henptr = varptr(hen)
//hen2をhenptrが示すポインタのクローンにする
dupptr hen2,henptr,4,4
//hen2を表示してみる
mes hen2
//hen2に書き込むと...
hen2 = 3
//henの中身も変わる
mes hen
のようになると思います。
ところで、VisualStudioで定義の表示はうまくできましたか?
今回も、よくわからないところは
言っていただければ説明できる場合があるかもしれません。
|
|
2014/11/25(Tue) 07:25:13|NO.66173
typedefは互換性維持のためのもので型などの別名を付けるときに使います。
C/C++などのint型やlong,charは環境依存で値の範囲が決まるので
ヘッダーなどでマクロなどを駆使して同じ名前で32bit符号付き整数型を利用したいとき
(実体はintやlong)などに利用します。
|
|
2014/11/27(Thu) 21:36:54|NO.66214
>skyblue さん
なるほどです!
やっと理解できた気がします。。。
ありがとうございます。
|
|
2014/12/1(Mon) 21:25:50|NO.66276
毎度のように返信遅くなってしまいすみません。
>typedef は型の変数みたいなものですか? いまいちよく分かりません。。。
検索するともっといい答えがたくさん出てくると思いますが、
(「聞かないで検索しろ」という意味ではありません,
私は説明が好きで下手なので…)
typedefは、「今までの型をもとに新しい型の形をコンパイラに教えるためのもの」
と考えればよいと思います。
typedefにはいくつかの使い方があって
1つめは、「typedef a b;」で
「bという型をaという型の別名として使う」という意味です。
2つめは、
「typedef struct {
a m1;
b m2;
} c」という形で、
「cを、aという型のm1というメンバと、bという型のm2というメンバを含む型として使う」
という意味です。
これは構造体と呼ばれ、msdnでは「〜〜 structure」と書かれます。
今回特に重要なのは、この使い方です。
3つめは、typedef enumの使い方で、列挙型,enumerationと書かれます。
ほかに、クラスと呼ばれるものの形を決める時にも使われる場合があります。
2つめについての説明で、
例で表した方の場合は、
c言語で(これは実行できませんが)
//↓cという型の変数v1があることを知らせる
c v1;
//↓bという型の変数v2があることを知らせる
b v2;
//↓v1という変数のm1というメンバにb型で3を代入する
v1.m2 = (b)3;
//↓v2にv1のm2を代入する
v2 = v1.m2;
のように使われ、
hspでは、
仮にaという型もbという型も32bit整数値であるとすると
//↓v1という変数をc型のサイズだけ確保し
sdim v1,8
//↓v2という変数を用意し
dim v2
//↓v1のm2にあたる部分(4byteめから4byte)に3を書き込む
lpoke v1,4,3
//↓v2にv1のm2にあたる部分の内容を代入する
v2 = lpeek(v1,4)
//↓内容確認
mes v2
のように使います。
winapiについては「ちょくとのページ」あたりを読むとよいかもしれません。
>Syntax は、HSP だと、...
functionの説明(例:MessageBox)の場合は、それでよいのですが、
今回はstructureの説明なので、意味が異なります。
syntaxの中身は、C言語でその型がどのようにtypedefされているかを表しています。
membersは、その中身にどんな型のなんという変数が含まれているかを示しています。
>僕の勘違いかもしれませんが
重要なことを言い忘れていました。
すみません。
msdnの下のほうにある「Requirements」の「Header」に書かれているファイルを
「#include <ヘッダファイル>」のように、
先頭に書かなければF12を押しても反応はありません。
またわからないところがあったら言ってください。
ついでに、
学生賞おめでとうございます。
| |
|
2014/12/6(Sat) 20:02:50|NO.66321
>tds12 さん
すみません、遅くなりました;;
>typedefにはいくつかの使い方があって
英文法みたいでややこしいです。。。hsp の説明がなければ理解できませんでした。。。
C言語を勉強すればいいのですが、VB から始めてます;;
>先頭に書かなければF12を押しても反応はありません。
出来ました!ありがとうございます。
>学生賞おめでとうございます。
ありがとうございます!モチベーションが上がります。
|
|
2015/2/13(Fri) 23:46:53|NO.67403
だいぶ間隔が開いてしまいました。
すみません。
このスレッドを見ている人も少ないと思うので、
ここから先はより柔軟に通信できるメールということでよいでしょうか。
2・3週間ほど返信がなければ、そちらへメールを送らせていただきます。
ところで、
私と1歳差だったので、てっきり受験で忙しいのだと思っていましたが、違いましたか?
|
|
2015/2/18(Wed) 15:29:38|NO.67437
>tds12 さん
>ここから先はより柔軟に通信できるメールということでよいでしょうか。
はい。わざわざありがとうございます。
学年末の試験が終わって、ようやくコンピュータが使えます!
1歳差というのは驚きです。もう少し早く本格的にプログラムをしていればよかったです。。。
|
|