代码中列出msvcrXXX.dll的版本
List versions of msvcrXXX.dll in code
我想从MS Visual Studio C运行时dll中导入一个函数,以便使用p/Invoke从c#调用它。但是,为了健壮性,我不想在我的DllImport属性中硬编码运行时库的版本。
我如何列出当前进程中加载的msvcrXXX.dll的版本,最好使用c#代码?
并且,一旦我有了名称列表,我如何在运行时加载给定dll名称的特定函数?
您可以使用以下Win32 api:
获取当前进程中的所有模块
GetModuleBaseName:获取模块basename,并查找是否与mscrtxxxx.dll匹配
GetProcAddress:获取mscrtxxx.dll
这里是示例代码,
HANDLE hProcess = GetCurrentProcess();
DWORD numBytesRequried = 0;
if(!EnumProcessModules(hProcess, NULL, 0, &numBytesRequried))
return -1;
HMODULE* phModules = new HMODULE[numBytesRequried/sizeof(HMODULE)];
if (!EnumProcessModules(hProcess, phModules, numBytesRequried, &numBytesRequried))
{
delete [] phModules;
return -1;
}
int mscrtver = -1;
MODULEINFO mscrtModuleInfo;
HMODULE hModuleMSVCRT = NULL;
TCHAR szModuleBaseName[MAX_PATH];
for(int i=0;i<numBytesRequried/sizeof(HMODULE);i++)
{
if (GetModuleBaseName(hProcess, phModules[i], szModuleBaseName, _countof(szModuleBaseName)) == 0)
continue;
_tcsupr_s(szModuleBaseName, MAX_PATH);
TCHAR* szFileName = _tcsrchr(szModuleBaseName, _T(''));
if (szFileName != NULL)
szFileName++;
else
szFileName = szModuleBaseName;
#ifdef _DEBUG
if (_stscanf_s(szFileName, _T("MSVCR%dd.dll"), &mscrtver) == 1)
#else
if (_stscanf_s(szFileName, _T("MSVCR%d.dll"), &mscrtver) == 1)
#endif
{
hModuleMSVCRT = phModules[i];
break;
}
}
delete [] phModules;
phModules = NULL;
if (mscrtver < 0 || hModuleMSVCRT == NULL)
return -1;
printf("MSCRT VER: %d.%drn", mscrtver/10, mscrtver%10);
typedef size_t (*funcptr_strlen)(const char*);
funcptr_strlen funcptr_test = (funcptr_strlen)GetProcAddress(hModuleMSVCRT, "strlen");
if (funcptr_test != NULL)
{
int test_ret = funcptr_test("abc");
printf("test ret: %d.rn", test_ret);
}
这是在我的电脑上运行的输出:
MSCRT server: 11.0
3.
相关文章:
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 不同的Visual Studio版本中缺少.dll
- 链接库错误 c/缺少 dll/错误版本?
- 如何将_RICHEDIT_VER(riched20.dll)升级到版本3或更高版本
- 如果使用低于 VS2015 的 vc++ 编译器版本编译,则 DLL 中的访问冲突
- 当使用CreateObject从VBScript引用DLL时C++如何处理DLL版本?
- Microsoft Visual Studio 2008,版本9.0.30739.1 SP,DLL构建错误
- 创建 "no-op" DLL 版本?
- 由于mcordbi.dll的错误版本,托管调试不再起作用
- 系统DLL如何与不兼容版本的Visual Studio一起使用
- 窗口如何处理加载两个不同版本的 DLL
- 调用64位C/C++DLL的C#应用程序崩溃,但运行32位版本
- Windows 10未加载版本可执行文件的DLL
- 在C++中获取 DLL 版本
- 我的Python interpreter使用的msvcrXX.dll版本
- 如何设置 XAudio2 dll 版本
- 避免DLL版本控制问题
- DirectX多个DLL版本
- 在c++中以编程方式从DLL中获取DLL版本-再次