Добрый день!
Я пишу программку на C#, задача которой — изменение настроек принтера с помощью функции WinAPI DocumentProperties. Точнее, я хочу изменить приватные настройки драйвера принтера, путем изменения битового содержимого памяти, полученного при считывании настроек.
Вот код, который я использую:
public enum DevModeOption
{
DM_UPDATE = 1,
DM_COPY = 2,
DM_PROMPT = 4,
DM_MODIFY = 8,
DM_IN_BUFFER = DM_MODIFY,
DM_IN_PROMPT = DM_PROMPT,
DM_OUT_BUFFER = DM_COPY,
DM_OUT_DEFAULT = DM_UPDATE,
}
[DllImport("WinSpool.drv", EntryPoint = "DocumentPropertiesA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
static extern unsafe int DocumentProperties(IntPtr hWnd, IntPtr hPrinter, [MarshalAs(UnmanagedType.LPStr)] string pDeviceName,
IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);
public void SetPrinterData(IntPtr formHandle, string PrinterName, List<DifferByteInfo> differBytes)
{
PrinterSettings psSettings = new PrinterSettings();
psSettings.PrinterName = PrinterName;
IntPtr ipDevMode = psSettings.GetHdevmode(psSettings.DefaultPageSettings);
IntPtr pDevMode = GlobalLock(ipDevMode);
IntPtr ipDevModeData = Marshal.AllocHGlobal(0);
try
{
int nSize = DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, pDevMode, pDevMode, 0);
ipDevModeData = Marshal.AllocHGlobal(nSize);
DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, ipDevModeData, pDevMode,
(int)DevModeOption.DM_OUT_BUFFER);
DEVMODE d2 = (DEVMODE)Marshal.PtrToStructure(ipDevModeData, typeof(DEVMODE));
foreach (DifferByteInfo b in differBytes)
{
Marshal.WriteByte(ipDevModeData, d2.dmSize + b.index, b.value);
}
//DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, IntPtr.Zero, ipDevModeData,(int)DevModeOption.DM_MODIFY);
//DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, ipDevModeData, ipDevModeData,
// (int) DevModeOption.DM_IN_BUFFER + (int) DevModeOption.DM_OUT_BUFFER);
DocumentProperties(formHandle, IntPtr.Zero, psSettings.PrinterName, IntPtr.Zero, ipDevModeData, (int)DevModeOption.DM_IN_BUFFER);
GlobalUnlock(ipDevMode);
}
finally
{
GlobalFree(ipDevMode);
Marshal.FreeHGlobal(ipDevModeData);
}
}
К сожалению он не работает. Подскажите, пожалуйста, в чем может быть дело?
С уважением, Николай.