InstallDriver.cpp
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:7k
源码类别:

打印编程

开发平台:

Visual C++

  1. // InstallDriver.cpp : Defines the entry point for the console application.
  2. //
  3. #pragma once
  4. // Modify the following defines if you have to target a platform prior to the ones specified below.
  5. // Refer to MSDN for the latest info on corresponding values for different platforms.
  6. #ifndef WINVER // Allow use of features specific to Windows XP or later.
  7. #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
  8. #endif
  9. #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.                   
  10. #define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
  11. #endif
  12. #ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
  13. #define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
  14. #endif
  15. #ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
  16. #define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
  17. #endif
  18. //#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
  19. #define _CRT_SECURE_NO_DEPRECATE
  20. // Windows Header Files:
  21. #include <windows.h>
  22. // C RunTime Header Files
  23. #include <stdlib.h>
  24. #include <tchar.h>
  25. #pragma comment(lib,"Winspool.lib")
  26. enum WINDOWS_VERSIONS {_UNKNOWN = 0,_W95 = 1,_W98 = 2,_WME = 3,_WNT = 4,_W2000 = 5,_WXP = 6,_W2003 = 7,_WVISTA = 8};
  27. WINDOWS_VERSIONS __cdecl _get_windows_version();
  28. int APIENTRY _tWinMain(HINSTANCE hInstance,
  29.                      HINSTANCE hPrevInstance,
  30.                      LPTSTR    lpCmdLine,
  31.                      int       nCmdShow)
  32. {
  33. MONITOR_INFO_2 mi2;
  34. HANDLE hPrinter = NULL;
  35. WCHAR portName[] = L"Popfax:";
  36.     DWORD  dwReturn = 0, dwStatus = 0;
  37.     DWORD  cbNeeded = 0;
  38. WCHAR txt[100] = L"";
  39. STARTUPINFO si;
  40. PROCESS_INFORMATION pi;
  41. TCHAR remPrinter[MAX_PATH] = L"rundll32 printui.dll,PrintUIEntry /dl /n "PopfaxPrinter" /q";
  42. TCHAR instPrinter[MAX_PATH] = L"rundll32 printui.dll,PrintUIEntry /if /b "PopfaxPrinter" /f imgprinter.inf /r "ImagePrinter Port" /m "PopfaxPrinter"";
  43. TCHAR pnputilVista[MAX_PATH] = L"install.bat";
  44. TCHAR instXP[MAX_PATH] = L"install_xp.bat";
  45. LPTSTR instPrn = instPrinter;
  46. DWORD ver = _get_windows_version();
  47. if( _W2000 < ver )
  48. {
  49. mi2.pDLLName = L"PopFaxLocalMon.dll";
  50. mi2.pEnvironment = L"Windows NT x86";
  51. mi2.pName = L"Popfax Local Port";
  52. if( AddMonitor( NULL, 2, (LPBYTE)&mi2 ) )
  53. {
  54. HKEY hKey = HKEY_LOCAL_MACHINE; 
  55. ShellExecute( NULL, L"open", L"net.exe", L"stop Spooler", NULL, SW_HIDE );
  56. ShellExecute( NULL, L"open", L"sc.exe", L"config Spooler start= auto", NULL, SW_HIDE );
  57. Sleep( 2000 );
  58. if( ERROR_SUCCESS == RegCreateKey( hKey, L"SYSTEM\CurrentControlSet\Control\Print\Monitors\Popfax Local Port\Ports", &hKey ) )
  59. {
  60. ZeroMemory( txt, sizeof(txt) );
  61. RegSetValueEx( hKey, L"Popfax:", 0, REG_SZ, (const LPBYTE)txt, (DWORD)1 );
  62. RegCloseKey( hKey );
  63. }
  64. ShellExecute( NULL, L"open", L"net.exe", L"start Spooler", NULL, SW_HIDE );
  65. }
  66. }
  67. else
  68. {
  69. HKEY hKey = HKEY_LOCAL_MACHINE;
  70. if( ERROR_SUCCESS == RegCreateKeyEx( hKey, _T("SYSTEM\CurrentControlSet\Control\Print\Monitors\ImagePrinter Port"), NULL, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL ) )
  71. {
  72. TCHAR path[4*MAX_PATH] = _T("");
  73. RegSetValueEx( hKey, _T("Driver"), NULL, REG_SZ, (const BYTE*)_T("imgport.dll"), (_tcslen(_T("imgport.dll"))+1)*sizeof(TCHAR) );
  74. GetTempPath( ARRAYSIZE(path), path );
  75. if( path[_tcslen(path)-1] != _T('\') )
  76. _tcscat_s( path, ARRAYSIZE(path)-_tcslen(path), _T("\") );
  77. RegSetValueEx( hKey, _T("path"), NULL, REG_SZ, (const BYTE*)path, (_tcslen(path)+1)*sizeof(TCHAR) );
  78. RegSetValueEx( hKey, _T("name"), NULL, REG_SZ, (const BYTE*)_T("ImagePrinter Port"), (_tcslen(_T("ImagePrinter Port"))+1)*sizeof(TCHAR) );
  79. RegSetValueEx( hKey, _T("format"), NULL, REG_SZ, (const BYTE*)_T("tif"), (_tcslen(_T("tif"))+1)*sizeof(TCHAR) );
  80. RegSetValueEx( hKey, _T("format_ext"), NULL, REG_SZ, (const BYTE*)_T("G3"), (_tcslen(_T("G3"))+1)*sizeof(TCHAR) );
  81. RegCloseKey( hKey );
  82. }
  83. }
  84. ZeroMemory( &si, sizeof(si) );
  85. si.cb = sizeof(si);
  86. si.dwFlags = STARTF_USESHOWWINDOW;
  87. si.wShowWindow = SW_HIDE;
  88. ZeroMemory( &pi, sizeof(pi) );
  89. if( CreateProcess( NULL, remPrinter, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
  90. {
  91. // Wait until child process exits.
  92. WaitForSingleObject( pi.hProcess, INFINITE );
  93. // Close process and thread handles. 
  94. CloseHandle( pi.hProcess );
  95. CloseHandle( pi.hThread );                     
  96. }
  97. ZeroMemory( &si, sizeof(si) );
  98. si.cb = sizeof(si);
  99. si.dwFlags = STARTF_USESHOWWINDOW;
  100. si.wShowWindow = SW_HIDE;
  101. ZeroMemory( &pi, sizeof(pi) );
  102. if( _W2000 < ver )//礤 
  103. {
  104. if( _WVISTA == ver )
  105. {
  106. if( CreateProcess( NULL, pnputilVista, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
  107. {
  108. // Wait until child process exits.
  109. WaitForSingleObject( pi.hProcess, INFINITE );
  110. // Close process and thread handles. 
  111. CloseHandle( pi.hProcess );
  112. CloseHandle( pi.hThread );                     
  113. }
  114. }
  115. if( CreateProcess( NULL, instXP, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
  116. {
  117. // Wait until child process exits.
  118. WaitForSingleObject( pi.hProcess, INFINITE );
  119. // Close process and thread handles. 
  120. CloseHandle( pi.hProcess );
  121. CloseHandle( pi.hThread );                     
  122. }
  123. return 0;
  124. }
  125. if( CreateProcess( NULL, instPrinter, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
  126. {
  127. // Wait until child process exits.
  128. WaitForSingleObject( pi.hProcess, INFINITE );
  129. // Close process and thread handles. 
  130. CloseHandle( pi.hProcess );
  131. CloseHandle( pi.hThread );                     
  132. }
  133.     return 0;
  134. }
  135. WINDOWS_VERSIONS __cdecl _get_windows_version()
  136. {
  137. OSVERSIONINFO verInfo;
  138. verInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  139. GetVersionEx(&verInfo);
  140.     switch( verInfo.dwPlatformId )
  141.     {
  142.   case VER_PLATFORM_WIN32_WINDOWS:
  143.  if( verInfo.dwMajorVersion == 4 && verInfo.dwMinorVersion == 0 )
  144. return _W95;
  145.  if( verInfo.dwMajorVersion == 4 && verInfo.dwMinorVersion == 10 )
  146. return _W98;
  147.  if( verInfo.dwMajorVersion == 4 && verInfo.dwMinorVersion == 90 )
  148. return _WME;
  149.   case VER_PLATFORM_WIN32_NT:
  150. if ( verInfo.dwMajorVersion <= 4 )
  151. return _WNT;
  152. if ( verInfo.dwMajorVersion == 5 && verInfo.dwMinorVersion == 0 )
  153. return _W2000;
  154. if (  verInfo.dwMajorVersion == 5 && verInfo.dwMinorVersion == 1 )
  155. return _WXP;
  156. if (  verInfo.dwMajorVersion == 5 && verInfo.dwMinorVersion == 2 )
  157. return _W2003;
  158. if (  verInfo.dwMajorVersion == 6 && verInfo.dwMinorVersion == 0 )
  159. return _WVISTA;
  160. }
  161.     return _UNKNOWN;
  162. }