1
我想用printui安裝虛擬打印機驅動程序,但我得到「操作無法完成(錯誤0x00000002)」(Os是Win7 x64)。這是因爲用於簽署驅動程序的證書已過期嗎?或者還有其他一些原因?如果是的話,那我怎樣才能獲得更多關於錯誤的信息(我不是C程序員)?無法使用printui安裝驅動程序。這是因爲驅動程序證書過期了嗎?
下面是安裝驅動程序的代碼:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
if (wcsstr(lpCmdLine, L"/chkxps"))
{
if (!PrinterExists(L"Microsoft XPS Document Writer"))
{
DispError(L"A MediSmart ePrinter nem telepíthető, mivel nem található XPS nyomtató a rendszerben");
return -10;
}
return 0;
}
LPWSTR printername = L"MediSmart ePrinter";
LPWSTR printername1 = L"MediSmart ePrinter - HealthFund";
LPWSTR printername2 = L"MediSmart ePrinter - B2B Electronic";
LPWSTR printername3 = L"MediSmart ePrinter - B2B Paper based";
LPWSTR portname = L"NUL:";
bool inst = wcsstr(lpCmdLine, L"/uninst") == NULL;
if (inst)
{
PRINTER_DEFAULTS pdef;
pdef.pDatatype = NULL;
pdef.pDevMode = NULL;
pdef.DesiredAccess = SERVER_ACCESS_ADMINISTER;
DWORD oneed;
DWORD err;
HANDLE hxcv;
if (!OpenPrinter(L",XcvMonitor Local Port", &hxcv, &pdef))
{
DispError(L"A virtuális nyomtató port létrehozása nem sikerült");
return -1;
}
XcvData(hxcv, L"AddPort", (LPBYTE)portname, (wcslen(portname) + 1)*2, NULL, NULL, &oneed, &err);
ClosePrinter(hxcv);
if (err && err != ERROR_ALREADY_EXISTS)
{
DispError(L"A virtuális nyomtató port létrehozása nem sikerült");
return -2;
}
}
//TODO ez nem lesz igy jo, ha majd drivert akarunk frissiteni
if (!inst || !PrinterExists(printername))
{
typedef void (CALLBACK *RunDllEntry)(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow);
HMODULE hmod = LoadLibrary(L"printui.dll");
if (!hmod)
{
DispError(L"A virtuális nyomtatót nem sikerült telepíteni: a printui.dll nem található");
return -3;
}
RunDllEntry entry = (RunDllEntry)GetProcAddress(hmod, "PrintUIEntryW");
if (!entry)
{
FreeLibrary(hmod);
DispError(L"A virtuális nyomtatót nem sikerült telepíteni: hibás printui.dll");
return -3;
}
WCHAR cmd[1000];
if (inst)
{
wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter.inf\"", printername, portname, lpCmdLine);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter_hf.inf\"", printername1, portname, lpCmdLine);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter_b2bel.inf\"", printername2, portname, lpCmdLine);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter_b2bpb.inf\"", printername3, portname, lpCmdLine);
entry(NULL, hmod, cmd, SW_SHOW);
}
else
{
wsprintf(cmd, L"/dl /n \"%s\"", printername);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/dl /n \"%s\"", printername1);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/dl /n \"%s\"", printername2);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/dl /n \"%s\"", printername3);
entry(NULL, hmod, cmd, SW_SHOW);
}
FreeLibrary(hmod);
}
#ifndef _DEBUG
if (inst)
RemoveDirectoryTree(lpCmdLine);
#endif
return 0;
}
Win32錯誤代碼0x00000002 = ERROR_FILE_NOT_FOUND : 「該系統找不到指定的文件。」。但是,您不指定返回錯誤代碼的函數。 – Gonmator
@Gonmator:哦,謝謝。當我搜索「操作無法完成(錯誤0x00000002)」我只有打印機相關的錯誤 –
您可以查看系統錯誤代碼列表[這裏](http://msdn.microsoft.com/en-us/庫/窗/臺式機/ ms681382%28V = vs.85%29.aspx)。我猜錯誤是在'XcvData()'?確保'portname'是正確的,並嘗試從'(wcslen(portname)+ 1)* 2'中刪除'+ 1'。 – jliv902