標準のユーザーアカウントでプログラムを実行すると、Winspool.drv「OpenPrinter」の呼び出しに問題が発生します。しかし、管理者アカウントでプログラムを実行したとき。API呼び出しを適切に実行できます。
このAPIを使用してOpenPrinterを呼び出そうとしています
[DllImport("WinSpool.drv", SetLastError = true)]
static extern unsafe bool OpenPrinter (string pPrinterName, int* phPrinter, void* pDefault);
このコードを使用して実装します
static unsafe int CSOpenPrinter(string printerName)
{
bool bResult;
int hPrinter;
PRINTER_DEFAULTS pd = new PRINTER_DEFAULTS();
//int rawsize = Marshal.SizeOf(pd);
//IntPtr pdPtr = Marshal.AllocHGlobal(rawsize);
//pd.pDatatype = null;
//pd.pDevMode = null;
pd.DesiredAccess = PRINTER_ALL_ACCESS;
bResult = OpenPrinter(printerName, &hPrinter, &pd);
System.Diagnostics.Debug.WriteLine("bResult: " + bResult);
if (!bResult)
{
throw new ApplicationException("Cannot open printer '" +
printerName + "' " +
Marshal.GetLastWin32Error());
}
return hPrinter;
}
繰り返しになりますが、プログラムを「管理者として実行」にしようとすると、そのコードは完全に機能します。アプリケーションを右クリックして[管理者として実行]を選択せずに、アプリケーションを管理者として実行するにはどうすればよいですか?
これはUACの問題だと思いますが、これを解決する方法を教えていただけますか?app.manifestを追加することは役に立ちますか?例を教えていただけますか?
すべてに最適