2009-07-28 11 views
0

私の意図は、システムに「Microsoft.SqlServer.Management.Sdk.Sfc.dll」が存在することを確認することですか否か。 \ Program Files \ Microsoft SQL Serverの\ 100 \ SDK \アセンブリdllがシステムに存在するかどうか、またはC++を使用してSQLSERVER2008がインストールされているかどうかを確認する方法

またはuは私にwhther SQLSERVER2008見つけるための少なくとも方法を提供することができます。そして、一般的に、これは通常、それは

Cで利用可能ですsqlserver2008のインストールを思い付いされますC++を使用してインストールされているか使用していないか

私はLoadLibrary( "Microsoft.SqlServer.Management.Sdk.Sfc.dll")を使用しています。

しかし、利用可能であってもNULLを表示します。

HINSTANCE hDLL = LoadLibrary(TEXT("Microsoft.SqlServer.Management.Sdk.Sfc.dll")); 
    if (hDLL == NULL) 
    { 
    printf("Could not load exe.0x%X\n",GetLastError()); 
    return; 
    } 
    else 
    printf("DLL found\n"); 

couldnot負荷EXE 0x7Eには筈iはEXCT経路指定されたエラーコードで表示します。

+0

そのDLLが存在しない場合、C#アセンブリコードではどうなりますか?たぶんあなたはそこの問題をより簡単に診断できますか? – sharptooth

+0

私は、sql2005を持っていて、別のシステムsql2008を発見するためのコマンドをリモートから与えると、Microsoft.SqlServer.Management.Sdk.Sfc.dllが利用できないので失敗します。そのdllのために利用できない場合は、単純にエラーメッセージを表示するためには、リモートsql2005がsql2005を必要とするようなsql2008が表示されます – Cute

+0

あなたのコードは正確に何が失敗しますか?その時点で問題を処理することは可能ですか? – sharptooth

答えて

0

1つの方法は、キーHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersionがレジストリに存在するかどうかを確認することです。

このコードhttp://www.daniweb.com/forums/thread12987.html#をチェックして、キーが存在するかどうかを確認することができます。私たちは、ファイルが存在するかどうかをチェックするために探しているこの答えのコメントで行く

歓声

0

。これを行う最も簡単な方法は、LoadLibraryではなくCreateFileを使用することです。ここではいくつかのサンプルコードは次のとおりです。

HANDLE hFile = NULL; 
// The flag OPEN_EXISTING will cause CreateFile to only return a valid 
// handle value if the file exists. If it doesn't it returns INVALID_HANDLE_VALUE 
// and sets the last error to ERROR_FILE_NOT_FOUND. 
hFile = CreateFile(TEXT("path.to.dll"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) 
if (hFile == INVALID_HANDLE_VALUE) { 
    DWORD dwError = GetLastError(); 
    if (dwError == ERROR_FILE_NOT_FOUND) { 
    // the file wasn't found 
    } else { 
    // unknown error... 
    _tprintf(TEXT("Error 0x%X\n"), dwError); 
    } 
} else { 
    // the file was found, be sure to close the handle 
    CloseHandle(hFile); 
} 


まあ、 LoadLibrary(lpFileName)は、システムのデフォルトのDLL検索順序( MSDN article on Dynamic-Link Library Search Order)を使用してDLLのパスは、デフォルトの検索パスにありません。それを直接指定する必要があります。

インストールパスは、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\VerSpecificRootDirというレジストリから取得できます。

LoadLibraryが失敗した場合にも、)はGetLastErrorを(呼び出してください私たちは、エラーが、それが失敗の原因となっているかを把握することができます(アクセス拒否、ファイルが見つからない、など)。

最後に、Microsoft.SqlServer.Management.Sdk.Sfc.dllは.net DLLであり、標準C++のエントリポイントがある場合とない場合があります。

+0

0x7Eはエラーコードです。指定されたモジュールが見つからないことを示します。 – Cute

+0

ファイルがシステムに存在するかどうかを知るためにこれを実行していますか、正しくありません(エクスポートされた関数を呼び出すためにロードしようとしていません)。 – Joshua

+0

私はそれが存在するかどうかを見つけようとしていますか? LoadLibraryへのハンドルがnullの場合、dllは使用可能ですが、これは私の考えですか? – Cute

関連する問題