计算机丢失MSVCR90.dll问题

时间:2022-10-04 00:27:46

添加了一段第三方代码,结果总是提示下面错误:

计算机丢失MSVCR90.dll问题

这种问题最容易想到vs安装不正确,丢失了这个DLL。尝试google下载了一个,丢到System32下,结果无济于事。错误更离谱:

计算机丢失MSVCR90.dll问题

于是决定差个究竟,步骤,逐段注释代码然后运行试错,最终问题定位在strdup函数的调用上。右键调至它定义的地方:

#if     !__STDC__

#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)
#pragma push_macro("strdup")
#undef strdup
#endif

_Check_return_ _CRT_NONSTDC_DEPRECATE(_strdup) _CRTIMP char * __cdecl strdup(_In_opt_z_ const char * _Src);

#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)
#pragma pop_macro("strdup")
#endif

#endif /* !__STDC__ */
注意 __STDC__宏,说明这个函数不是标准C函数。

这里列出了C标准库string.h中定义的内容:

<cstring> (string.h)
C Strings
This header file defines several functions to manipulate C strings and arrays.

Functions
Copying:
memcpyCopy block of memory (function )
memmoveMove block of memory (function )
strcpyCopy string (function )
strncpyCopy characters from string (function )

Concatenation:
strcatConcatenate strings (function )
strncatAppend characters from string (function )

Comparison:
memcmpCompare two blocks of memory (function )
strncmp Compare two strings (function )
strcoll Compare two strings using locale (function )
strncmp Compare characters of two strings (function )
strxfrm Transform string using locale (function )

Searching:
memchrLocate character in block of memory (function )
strchr Locate first occurrence of character in string (function )
strcspn Get span until character in string (function )
strpbrk Locate characters in string (function )
strrchr Locate last occurrence of character in string (function )
strspn Get span of character set in string (function )
strstr Locate substring (function )
strtok Split string into tokens (function )

Other:
memset Fill block of memory (function )
strerror Get pointer to error message string (function )
strlen Get string length (function )

Macros
NULL Null pointer (macro )

Types
size_t Unsigned integral type (type )
ref: http://www.cplusplus.com/reference/cstring/


解决方法自己实现这个函数!

char* x_strndup( const char *s1, size_t n)
{
char *copy= (char*)malloc( n+1 );
memcpy( copy, s1, n );
copy[n] = 0;
return copy;
};

char* x_strdup( const char* s1 )
{
char* copy = (char*)malloc(strlen(s1) + 1);
strcpy(copy, s1);
return copy;
}