- PR -

GUI登録されたタスクの編集

投稿者投稿内容
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-12 23:26
えーと、手元では試せないので結局推測だけになってしまって申し訳ないですが。
示されたコードにいくつか疑わしいところがあるのでその辺を。

コード:

Private Declare Auto Function NetScheduleJobEnum Lib "netapi32.dll" _


どうせ関数そのものがNT系限定ですからこれでも構わないんですが、AutoよりUnicodeの方が良いと思います。

コード:

Private Const MAX_PREF_LEN = -1&


コード:

Private Const ERROR_MORE_DATA = 234&


&はLongを表すサフィクスですから、この場合はIntegerを表すサフィクス%またはIが良いですね。
というか型を付ければ基本的にサフィクスは不要ですから、As句を付けて
Private Const MAX_PREF_LEN As Integer = -1
とか書いた方が良いでしょう。

コード:
Private Structure AT_INFO

Public JobId As Long
Public JobTime As Long
Public DaysOfMonth As Long
Public DaysOfWeek As Byte
Public Flags As Byte
Public dummy As Integer
Public Command As String
End Structure


NetScheduleJobEnumが使用するのはAT_ENUM構造体ですよ?
まあメンバはAT_ENUMのものになってるようですけど。
で、Longがまだ残ってますね。DWORDにせよDWORD_PTRにせよIntegerです。
またこのdummyってメンバは一体?
それからこの構造体にもSystem.Runtime.InteropServices.StructLayoutAttribute属性を付けて、LayoutKind.SequentialとCharSet.Unicodeを指定した方が良いでしょう。

コード:
    Dim lngEntriesRead As Long

Dim lngTotalEntries As Long
Dim lngResumeHandle As Long = Nothing
Dim lngEntry As Long


この辺もLongが残っちゃってますねー。

コード:
    strServerName = "srv"


MSDNによれば、
引用:

Servername
この関数を実行するリモートサーバーの名前を表す、Unicode 文字列へのポインタを指定します。この文字列の先頭は "\\" でなければなりません。このパラメータが NULL の場合、ローカルコンピュータを使います。

とのことですが。
//会議室の仕様でバックスラッシュの数が変になってますが、2つです。
[追記]
//って本書きでは正しく表示されるー。プレビューじゃ4つになってたのにー。

コード:
    If (lngApiResult = NERR_Success) Or (lngApiResult = ERROR_MORE_DATA) Then


VB.NETにはOrElseキーワードが追加されています。
このキーワードを使えばlngApi = NERR_SuccessがTrueの時点でThen節に入り、後者の条件判断を省略できます。
もちろんlngApi = NERR_SuccessがFalseの場合はlngApiResult = ERROR_MORE_DATAが判断されます。

コード:
            Dim current As New System.IntPtr(lngBufferPointer.ToInt64 + (structSize * i))


サンプルにあった i が残っちゃってます。ここではlngEntryですね。
数行前のDim i As Integerも不要です。

コード:
            Dim obj As Object = _

System.Runtime.InteropServices.Marshal.PtrToStructure(current, typAtInfo)

Dim udtAtInfo As AT_INFO = CType(obj, AT_INFO)


ええと、PtrToStructureメソッドでぬるりが発生してるんですね?
多分ですが、AT_INFO(AT_ENUM)構造体の定義がおかしいせいでCommandメンバに正しい文字列のポインタが当てられず例外が発生してるんだと思います。
AT_INFO(AT_ENUM)構造体を正しく定義してみて下さい。


余談:
Integerの変数に対してlngプリフィクスは違和感が強いです

[ メッセージ編集済み 編集者: Hongliang 編集日時 2005-08-12 23:30 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-13 09:35
あ、あと忘れてましたが。

引用:

MSDN, NetScheduleJobEnum関数より:

PointerToBuffer
1 個のバッファへのポインタを指定します。関数から制御が返ると、このバッファに、複数の AT_ENUM 構造体からなる 1 つの配列が格納されます。このバッファはシステムによって割り当てられたもので、NetApiBufferFree 関数を 1 回呼び出して解放しなければなりません。この関数が失敗して ERROR_MORE_DATA が返った場合でも、このバッファを解放しなければならないことに注意してください。



とのことですので、処理を終了したらきっちりバッファを解放してあげて下さいね。

//うーん、あとで完全版コードに書き直しておくべきか。

スキルアップ/キャリアアップ(JOB@IT)