首页 > 代码库 > 计算机丢失MSVCR90.dll问题

计算机丢失MSVCR90.dll问题

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


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


于是决定差个究竟,步骤,逐段注释代码然后运行试错,最终问题定位在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:
memcpy		Copy block of memory (function )
memmove		Move block of memory (function )
strcpy		Copy string (function )
strncpy		Copy characters from string (function )

Concatenation:
strcat		Concatenate strings (function )
strncat		Append characters from string (function )

Comparison:
memcmp		Compare 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:
memchr		Locate 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;
}