Jump to navigation
| 1 |
2005年 5月 02日 (月曜日)
- Work on miau's blog?
現在手伝い中のシステムは、
PHP→ASP→ActiveX→DLL→EXE
なんてやたら複雑な造りになってて、DLL と EXE ってのは旧システムを作った会社から提供されています。
で、今回私が作ってるのは ActiveX の部分で。
DLL のドキュメントはあるものの、基本的にブラックボックスなので、妙な手を使って調査する機会が多かったりして。
そのへんのネタです。
[Read More!]
- Work on miau's blog?
前項で「DLL のソースが〜」とか書きました。
ここで「DLL のソースがあるんなら、Debug モードで DLL をビルドしなおして、ステップ実行でデバッグしたほうが早いんじゃない?」と思った方もいるかとおもいますが・・・まったくもってその通りです。
それができなかった理由として、
・作ってるのが ActiveX だったので、そういうことはできないと思ってた
・呼び出し元が VBScript だったので、そういうことはできないと(以下略)
・DLL のソースが全て揃っているという認識がなかった
というのがあるわけで。
さらに分析すると、
・VC++ に不慣れすぎた
・ActiveX の動作原理がわかってなかった
・VC++ デバッガの動作原理がわかってなかった
・ドキュメントとファイルが雑然としている
あたりが原因と言えそうです。
最初の2つに関しては、この休みですこし鍛えておきたいところ。
ちなみに、VBScript から呼び出す場合のデバッグ方法は、
プロジェクト→設定→デバッグ で、
・デバッグ セッションの実行可能ファイル: C:\WINNT\system32\wscript.exe
・プログラムの引数: <対象の VBS ファイル>
とでもしておくといいらしい。
- Work on miau's blog?
戻り値を MsgBox() とかで画面に出してたんですけど、文字数に制限があるんですね。
1 byte 文字で 1024 文字までとかなんとか。
こういう場合は WScript.Echo を使え、と。
で、ファイルに吐きたければcscript hoge.vbs > hoge.out
とか?
このへんも不慣れだなぁ・・・。
2005年 5月 17日 (火曜日)
- Work on miau's blog?
Borland C++ Builder には「ビルド実行するたびにビルド番号を増やす」みたいなオプションがあった気がするけど、VC++ 6.0 にはそういう機能はないらしい。
ということで、
自動ビルド番号増加 アドインを導入。
未登録だと起動のたびに確認メッセージがでたりしますが、機能制限があるわけではないので良心的(?)
Visual SourceSafe とうまく連携すればもっとうまく管理できるのかもしれませんが、まあとりあえず。
- Work on miau's blog?
関数やメソッド内で大きな配列を宣言すると、プログラム実行直後にいきなり落ちることが。
デバッグすると、CHKSTK.ASM の
probepages:
sub ecx,_PAGESIZE_ ; yes, move down a page
sub eax,_PAGESIZE_ ; adjust request and...
test dword ptr [ecx],eax ; ...probe it
なんて行で落ちている様子。
謎なのでググってみると・・・
GAH! WTF? - GameDev.Net Discussion Forums
your overflowing your stack, check your functions maybe one has a huge
array defined or something (place it on the heap [global] or malloc it).
Or try a complete rebuild.
なるほど。スタックオーバーフローと。
対処法はいろいろ書いてるけど、とりあえず一番楽&可読性高いかなということで static 変数にしておきました。
2005年 5月 29日 (日曜日)
- Work on miau's blog?
以前のアイテムで、aiWM Web Tester を使ったという話は書きましたが。
今回複数ページに似たような修正を加える必要が出てきまして。
自動化に適してたので再挑戦してみました。
[Read More!]
- Work on miau's blog?
VBScript の
GetTempName メソッド。
一時ファイルまたは一時フォルダの名前をランダムに生成して返します。
ということで、今回ランダムなファイルを作るのに使ってたんですが。
たまに同じファイル名が生成されることがあるようですね。
なんらかのロジックで重複しないようになってると思ったんですが・・・考えられる原因として、
・Dual CPU なマシンだから本来起きないはずの「本当に同一時刻」における処理になった
あるいは
・GetTempName は TemporaryFolder 内でのファイルとして使われるのが前提で、TemporaryFolder に存在しないファイル名を返すだけ
とか?完全に推測ですが。
とりあえず、
Dim fso
Dim ts
Set fso =CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set ts = fso.CreateTextFile(fso.GetTempName(), False)
Do While IsEmpty(fs)
If Err.Number <> 58 Then '「既に同名のファイルが存在しています。」以外
WScript.Echo Err.Description & vbCrLf
Err.Clear
Exit Function
End If
Set ts = fso.CreateTextFile(fso.GetTempName(), False)
Loop
みたいな形で回避。
ちなみにこのせいで周囲巻き込んで徹夜。
もっと詳しい説明ほしかった。
そういえば
CreateTextFile メソッド の
overwrite
省略可能です。既存ファイルの場合に上書きするかどうかを示すブール値を指定します。
上書きする場合は真 (true) を、上書きしない場合は偽 (false) を指定します。
省略した場合は、既存ファイルは上書きされません。
も間違ってたっぽくて、ここでもハマった。
しっかりしてー。>msdn
| 1 |