|
分類:[.NET 全般]
2009/06/29(Mon) 11:29:54 編集(投稿者) 2009/06/29(Mon) 11:29:46 編集(投稿者)
ぬーぼーと申します。
C#にてプリンタのジョブを管理するためのプログラムに、WinAPIを使うことにしたのですが、その際に使用する構造体「PRINTER_NOTIFY_OPTIONS_TYPE」へ値を設定するところで躓いています。
C++では、 typedef struct _PRINTER_NOTIFY_OPTIONS_TYPE { WORD Type; WORD Reserved0; DWORD Reserved1; DWORD Reserved2; DWORD Count; PWORD pFields; } と定義されているので、それをC#に置き換えると、 public class PRINTER_NOTIFY_OPTIONS_TYPE { public ushort wType; public ushort wReserved0; public uint dwReserved1; public uint dwReserved2; public uint FieldCount; public IntPtr pFields;
} となると思います。 その中のpFieldsにushortの配列 ushort[] JobFields = {0x01,0x02,0x03,0x04,0x05,0x06};
を設定したいと思っているのですが、この配列のポインタを取得しようと、
PRINTER_NOTIFY_OPTIONS_TYPE hoge = new PRINTER_NOTIFY_OPTIONS_TYPE(); Marshal.StructureToPtr(JobFields, hoge.pFields, true);
としたところ、「指定された構造体は高速転送型か、またはレイアウト情報を含んでいなければなりません。」 となってしまいます。 別の方法として、
PRINTER_NOTIFY_OPTIONS_TYPE hoge = new PRINTER_NOTIFY_OPTIONS_TYPE(); hoge.pFields = Marshal.AllocHGlobal(Marshal.SizeOf(JobFields[0]) * JobFields.Length); int ofs = 0; for (int i = 0; i < JobFields.Length; i++) { Marshal.WriteInt16(Notifications1.pFields, ofs, (short)JobFields[i]); ofs += Marshal.SizeOf(JobFields[i]); } ともしてみたのですが、正しいのかどうか...
どうか、「こうすれば」というのがあれば、お教えください。 よろしくお願いいたします。
|