如何查找系统中是否存在dll或如何查找是否使用c ++安装SQLSERVER2008

时间:2009-07-28 13:57:18

标签: c++ visual-c++

我的意图是找到系统中是否存在“Microsoft.SqlServer.Management.Sdk.Sfc.dll”。一般来说,这将是sqlserver2008安装,通常它可用于

C:\ Program Files \ Microsoft SQL Server \ 100 \ SDK \ Assemblies

或者你可以为我提供至少一种方法来查找使用c ++安装或不安装SQLSERVER2008

我正在使用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");

显示无法加载exe 0x7E是错误代码尽管我给出了exct路径。

2 个答案:

答案 0 :(得分:0)

一种方法是检查注册表中是否存在密钥HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion

您可以查看此代码http://www.daniweb.com/forums/thread12987.html#以确定密钥是否存在。

欢呼声

答案 1 :(得分:0)

根据本回答中的评论,我们要查看文件是否存在。最简单的方法是使用CreateFile而不是LoadLibrary。以下是一些示例代码:

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 ++的入口点。