2011-06-24 16 views
5

ここで、サードパーティデバイスドライバのインストール方法を教えてください。 必要なファイル、つまりinfファイル、.sysなどがすべて提供されていればプログラムでインストールできますか?このソリューションが動作しなければならない最小のオペレーティングシステム はWindows2000です。INFファイルを使用してドライバをプログラムでインストールする

は、私が何をされ、新しいハードウェアのユーザーインターフェースが見つかり勝利フォルダ\ INFフォルダに.infファイルと勝利フォルダ\ SYSTEM32 \ドライバーにSYSファイル が、ポップアップ表示 デバイスの各時間プラグ、窓をコピーしてみました私は避けようとしています。

以下は試したものですが、この関数はerror 87 (The parameter is incorrect)を返します。

HINF HInf;     
UINT ErrorLine;    
BOOL bRes = FALSE; 
PBOOL FileWasInUse = FALSE; 

LPCSTR szSourceFileName = _T("C:\\Drivers_HypercomP1320\\hypvcpusb.inf"); 
LPCSTR szInfFileName = _T("hypvcpusb.inf"); 
PVOID Context = NULL; 

HInf = SetupOpenInfFile (szSourceFileName, NULL, INF_STYLE_WIN4, &ErrorLine);   

LPCSTR SourceFile = ("hypvcp.sys"); 
LPCSTR SourcePathRoot = _T("C:\\Drivers_HypercomP1320"); 
LPCSTR DestinationName = _T("C:\\WINDOWS\\system32\\drivers\\hypvcp.sys"); 

bRes = SetupInstallFileEx (HInf, NULL, SourceFile, SourcePathRoot, DestinationName, SP_COPY_FORCE_IN_USE, 
          (PSP_FILE_CALLBACK)CopyMsgHandler, Context, FileWasInUse); 

DWORD dwVal = GetLastError(); 

SetupCloseInfFile(HInf); 


// Callback function 
UINT CopyMsgHandler (UINT Context, UINT Notification,UINT_PTR Param1, UINT_PTR Param2) 
{ 
    UINT rtnValue = NO_ERROR; 
    return rtnValue; 
} 

ありがとうございます。

+0

をクリーンアップするには、右のインストール]をクリックし、INFファイルをクリックしてください。 – Aristos

+0

@Aristos:あなたはそれを行うためにJavaロボットを使用することもできます:-) –

+1

Guyzは返信をありがとうございますが、ドライバのインストールはC、C++でプログラム的です。 – newdev1

答えて

1

InstallHinfSectionを使用できます。

+0

バッチファイルを使用して簡単なテストを行いましたが、このAPIはWindows Vistaにドライバをインストールしていません。デバイスを接続すると、ウィンドウがポップアップします。新しいハードウェアUIが見つかりました。RUNDLL32.EXE SETUPAPI.DLL、InstallHinfSection TI3410.Uni 128 C:\\ Drivers_Test \\ Testusb.inf – newdev1

2

それは

PBOOL FileWasInUse = FALSEの使用であるかもしれません。

。変更する必要があります。

BOOL FileWasInUse = FALSE;

& FileWasInUse(& -characterに注意してください)との関数呼び出しで使用します。

+0

+1このパラメータは必須です。NULLポインタを渡しますエラー87が発生します。 –

+0

あなたは正しいですが、今度は関数が正しく実行されますが、デバイスを接続すると「Found New Hardware」ウィザードが表示されます。私もPCを再起動しようとしたが、同じ結果を再びデバイスに接続しました。それはドライバをインストールするために使用できる別のアプローチはありますか? – newdev1

+0

@ newdev1:私は本当に知らない、私はちょうどプログラミングエラーを発見した。しかし、それは新しい質問のための良い資料として私に聞こえる! –

0

はい。あなたは呼び出して起動します

SC_HANDLE manager = OpenSCManager(NULL、NULL、SC_MANAGER_ALL_ACCESS); if(manager) { wprintf(L "開いたSCマネージャー\ n"); } else { wprintf(L "Open SC Managerが失敗しました\ n"); リターン;そして、あなたが呼び出すszInfFileNameに保存されている.infファイルを持つ }

HInf = SetupOpenInfFile(szInfFileName.c_str(), NULL, INF_STYLE_WIN4, &ErrorLine); 

次にあなたが

if (SetupInstallFileEx(HInf, NULL, SourceFile, SourcePathRoot, DestinationName, SP_COPY_NEWER_OR_SAME, NULL, Context, &FileWasInUse) == NULL) 

呼び出すSOURCEFILEは SourcePathRoot =(.SYSで終わる)ドライバのファイル名を=ドライバファイルの場所(プログラムが実行されるパス) DestinationName =インストールするドライバのフルパス(例:

c:\windows\system32\drivers\yourdriver.sys 

レジストリがあります。 ドライバ名、表示名、説明、ErrorControlとグループ:あなたは

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ 

このエントリ(キー)が必要です下でのあなたのドライバーのためのエントリを追加する必要があります。

次のステップ、あなたが使用してドライバを起動します。レジストリエントリに登場してキー名をSystem32に下にドライバのパスがある

SC_HANDLE service = CreateService(manager, 
        DRIVER_NAME, 
        DRIVER_NAME, 
        SERVICE_ALL_ACCESS, 
        SERVICE_KERNEL_DRIVER, 
        SERVICE_AUTO_START, 
        SERVICE_ERROR_NORMAL, 
        KeyName, 
        NULL, NULL, NULL, NULL, NULL); 

。たとえば:

system32\drivers\yourdriver.sys 

最終ステップ:

BOOL result = StartService(service, 0, NULL); 

CloseServiceHandle(manager) 
関連する問題