テンプレ更新

大して記事書いてもいないのにテンプレ更新するのもあれなんですが表示がおかしくなってたので切り替えました

応用技術者試験の合格発表は12月21日
覚えやすいけど遅すぎる…クリスマス前か…

なんか技術系の記事3つぐらい公開しないまま途中で書き終わってるので
学園祭でこの1週間休みだから書こうかな
そういえば夏休みの間に他大学の彼女がめでたく出来たんだけど平日だから一緒に回れない…
ので多分彼女の大学まで遊びに行きます

あと友達に誘われて社交ダンスサークルに入りました
背が高いと、新体操っぽいのでは不利と散々言われてきましたが
社交ダンスでは逆に背が高いといいらしい
のでがんばります
2009-11-24 : その他 : コメント : 0 : トラックバック : 0
Pagetop

応用情報処理技術

応用情報処理技術者試験、受けました
勉強時間足りなさ過ぎてもうムリポ

基本情報処理技術者試験
午前 勉強時間 100時間
午後 勉強時間 2時間

応用情報処理技術者試験
午前 勉強時間 10時間
午後 勉強時間 30分(試験日の昼休み)

・・・本来なら応用の方が勉強時間必要なはずなのに受かるわけない
5100円出費してくれた親ごめんなさい・・・夏休み遊んでばかりでごめんなさい・・・


さて、自己採点してみた

午前 64点 合格ライン60点
午後 64点 合格ライン60点

午前は配点率が統一されたから通っただろう
午後は記述のところ空白だらけだからかなり厳しい
もし通ったら万々歳、自惚れずに精進・・・
2009-10-19 : リアル : コメント : 0 : トラックバック : 0
Pagetop

VB.NET:SetWindowLong

どうもご無沙汰してます
まぁアクセスログ眺めるとほとんどがMapleStoryの窓化多重起動で検索してやってきた人ばかりなので特に新しい記事を読んでもらってるとは思っておりません


さて、記事の内容に一貫性はありませんが今回はVB.NETの話
ふと、思い出したそれは・・さるべーじさんの「VB5:カクカクとリサイズしたい。」というもはや10年以上前の記事
これをVB.NETに移そうとしてもうまくいかなかった3,4年前。
ちょっとVB.NETで開発してた時にそのことを思い出したので再挑戦してみたら、
苦戦しながらもなんとか実装できた。

のでVB.NET用に変換したコードとして貼り付けておきます
面倒くさいので色付けはコメントのみに・・・

'コードの先頭に
Imports System.Runtime.InteropServices

'WindowsAPI関数の宣言
Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
    (ByVal hWnd As Integer, ByVal nIndex As Integer, <MarshalAs(UnmanagedType.FunctionPtr)> ByVal dwNewInteger As fncKakuDragDelegate) As Integer
Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
    (ByVal hWnd As Integer, ByVal nIndex As Integer, ByVal dwNewInteger As Integer) As Integer
Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
    (ByVal lpPrevWndFunc As Integer, ByVal hWnd As Integer, ByVal MSG As Integer, _
    ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
    (ByVal Destination As Integer, ByVal Source As Integer, ByVal Length As Integer)
Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
    (ByRef Destination As RECT, ByVal Source As Integer, ByVal Length As Integer)
Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
    (ByVal Destination As Integer, ByRef Source As RECT, ByVal Length As Integer)
'RECT構造体の宣言
Structure RECT
    Dim Left As Integer
    Dim Top As Integer
    Dim Right As Integer
    Dim Bottom As Integer
End Structure
'定数の宣言
Public Const GWL_WNDPROC = (-4)
Public Const WM_SIZING = &H214
'もともとのウィンドウ関数のアドレス
Public OldWp As Integer

'デリゲートの宣言
Delegate Function fncKakuDragDelegate( _
    ByVal hWnd As Integer, ByVal uMsg As Integer, _
    ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Public Function fncKakuDrag( _
    ByVal hWnd As Integer, ByVal uMsg As Integer, _
    ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    '*** フックしたメッセージの振り分けと対処
    Select Case uMsg
        Case WM_SIZING
            Dim wkRect As RECT
            Dim Length As Integer = Marshal.SizeOf(wkRect)
            MoveMemory(wkRect, lParam, Length)
            wkRect.Right = wkRect.Left + 250
            wkRect.Bottom = wkRect.Top + ((wkRect.Bottom - wkRect.Top) \ 50) * 50
            MoveMemory(lParam, wkRect, Length)
        Case Else
            Return CallWindowProc(OldWp, hWnd, uMsg, wParam, lParam)
    End Select
    Return 0
End Function

'フック開始
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    OldWp = SetWindowLong(Me.Handle.ToInt32, GWL_WNDPROC, AddressOf fncKakuDrag)
End Sub

'フック終了
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.FormClosed
    OldWp = SetWindowLong(Me.Handle.ToInt32, GWL_WNDPROC, OldWp)
End Sub



何がどう変わったのかは大体見比べてくれるとわかるんじゃないかと思います

・VB5でいうLong型はVB.NETでいうInteger型

・構造体の宣言の仕方はVB5と違うので修正

…あんまり細かく書くと結構長いので中略

・LenB関数はVB.NETにはないのでMarshal.SizeOf関数で構造体のバイトのサイズを取得する

・AddressOf演算子で取得する関数のアドレスはVB5では多分Long型だが、VB.NETではデリゲート型なのでDelegateキーワードでデリゲートを定義

○SetWindowLong関数の定義で第3引数をデリゲート型にする。

・MoveMemory関数の定義でなんでもOK?なAny型はVB.NETではできないので型をRECTにする。2つ宣言して片方はInteger、RECT、Integerで片方はRECT、Integer、Integerの引数にする

・RECT構造体を引数に渡す際、ByValキーワードだと値渡しになるので参照渡しのByRefキーワードに書き換える

…エトセトラ!


まぁそんなこんなで一番頭を抱えさせたのは上記の青色の文
最終的には第3引数に<MarshalAs(UnmanagedType.FunctionPtr)>という属性をつけることで解決しますが、この属性がなければCallbackOnCollectedDelegateというエラーが出る
コールバックが、型 なんちゃらかんちゃら のガベージ コレクションされたデリゲートで行われました。これは、アプリケーションのクラッシュ、破損、およびデータの損失を発生させる可能性があります。デリゲートをアンマネージ コードに渡すとき、デリゲートは 2 度と呼び出されないことが確実になるまでマネージ アプリケーションによって維持されなければなりません。
わけわかめ。

マネージってのは・・・まぁ.NET FrameWorkを利用するプログラム
アンマネージってのは従来のネイティブプログラム…ここではWindowsAPI、SetWindowLong関数のこと

SetWindowLongの第3引数にデリゲート型を指定すると、コールバックしてアンマネージコードからマネージコードに帰ってくるときにガベージコレクション…使用メモリの整理が行われるため、関数のアドレスがごっちゃになって?危険だよ…的な感じかな…?

とにかく、アンマネージな引数にしたいので、属性を指定すると、うまく動いた。

参考URL
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet28/vb6tonet28_03.html
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet23/vb6tonet23_01.html


2009-09-01 : その他 : コメント : 0 : トラックバック : 0
Pagetop

痴漢

痴漢にあった

別にカワイイ女だったらいくらでも触らせてやるがおっさんでした
混雑気味の電車内で不自然な立ち位置から不自然に手が忍び寄りおいらのアレを甲で触れるおっさん
まぁまぁ、勘違いかもしれないと思い、始めは気にしてなかったが明らかに触ってきている
ウゼーとか思いながら次の駅で場所移動しようとしたら、漏れなくおっさんの手も途中までおいらのアレに付いてきてた

畜生!訴えておけばよかった!
2009-07-11 : リアル : コメント : 0 : トラックバック : 0
Pagetop

基本情報処理技術者試験

合格キタ!

午前・午後ともに合格ライン60点で、

午前の単純正答率 79% 自己採点
午前得点 83.75点

午後の単純正答率 72% 自己採点
午後得点 80.00点

ウワーイ
2009-05-27 : その他 : コメント : 0 : トラックバック : 0
Pagetop
ホーム  次のページ »

プロフィール

うおきち

Author:うおきち
ネットゲーマー兼プログラマー

レンタルSNS
  1. 無料アクセス解析


BGM♪

クラシックMIDI ラインムジーク

ブログ内検索

Powered By FC2ブログ

Powered By FC2ブログ
ブログやるならFC2ブログ