2014-07-03 28 views
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; 
} 
+1

Win32錯誤代碼0x00000002 = ERROR_FILE_NOT_FOUND : 「該系統找不到指定的文件。」。但是,您不指定返回錯誤代碼的函數。 – Gonmator

+0

@Gonmator:哦,謝謝。當我搜索「操作無法完成(錯誤0x00000002)」我只有打印機相關的錯誤 –

+0

您可以查看系統錯誤代碼列表[這裏](http://msdn.microsoft.com/en-us/庫/窗/臺式機/ ms681382%28V = vs.85%29.aspx)。我猜錯誤是在'XcvData()'?確保'portname'是正確的,並嘗試從'(wcslen(portname)+ 1)* 2'中刪除'+ 1'。 – jliv902

回答

0

我找到了答案:我必須與指定路徑的命令參數運行...

+0

只是作爲補充,運行printui安裝沒有有效或過期證書的驅動程序將提示一個窗口,詢問有關驅動程序提供程序信心的確認。 –