我的意图是找到系统中是否存在“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路径。
答案 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 ++的入口点。