2010-04-29 3 views
0

C++ 응용 프로그램에서 간단한 C++ 래퍼 클래스를 호출 한 다음 기존 C++ DLL을 호출합니다. C++ 코드는 모두 VC++ 6.0입니다.Windows 2008에서 variant와 bstr_t가 일치하지 않는 충돌을 일으키는 경우

일관성없는 동작이 발생하지만 충돌이 일어날 때 항상 C++ 래퍼 DLL 내에서 발생하며 항상 동일한 위치 (고통스러운 로깅 문을 사용하여 확인 됨)에서 발생합니다. Windows 2008을 제외한 모든 환경에서 절대로 발생하지 않으므로 Windows 2008을 염두에 두었던 치명적인 메모리 손상이 의심됩니다.

여기에 관련 코드가 있습니다. 누군가가 왜 충돌 할 수 있는지에 대한 아이디어가 있다면 크게 도움이 될 것입니다. 우리는 며칠 동안 우리의 머리카락을 찢어 버렸고 프로젝트 타임 라인은 C#으로 간단한 문자열을 되돌릴 수 있기를 원하는 모든 이유로 미끄러지고 있습니다 ...

VARIANT VariantInit을 사용하여 vresult를 처리하고 VariantClear를 완료했는데이를 지우지 만 도움이되지 않습니다.

// JobMgrDll.cpp : Defines the entry point for the DLL application. 
// 

#include "stdafx.h" 
#include "JobMgrDll.h" 
#include "jobmgr.h" 

CString gcontext; 
CString guser; 
CString ghost; 
CString glog; 
JOBMGRDLL_API int nJobMgrDll=0; 

extern "C" JOBMGRDLL_API char* perform_billcalc(char* cmd, char* context, char* user,char* host,BSTR* log,int* loglen) 
{ 
char* result = new char[1000]; 
memset(result,0,999); 
result[999] = '\0'; 
bstr_t bt_command = cmd; 

UUID uuid = __uuidof(BRLib::Rules); 
VARIANT vresult; 
char *p_rv; 
gcontext = context; 
guser = user; 
ghost = host; 
write_log("execute_job"); 
p_rv = execute_job(uuid, "none", bt_command, &vresult); 
write_log("DONE execute_job"); 
CString message; 

write_log ("Intializing bstr_t with variant"); // WE ALWAYS GET HERE 
bstr_t res(vresult); 

//message.Format("%s result = %s",p_rv,res); 
//write_log(message); 
write_log("copying Result"); // WE DON'T ALWAYS GET HERE, BUT SOMETIMES WE DO 
strcpy(result,(char*)res); 
write_log(CString(result)); 

*loglen = glog.GetLength(); 
*log = glog.AllocSysString(); 

return result; 
} 

다시 말하면, 많은 아이디어가 많이 감사하겠습니다.

답변

1

힙 및 스택 손상 가능성이 많습니다. 변형을 초기화하지 않는 것은 자살입니다. 길이를 확인하지 않고 C 문자열을 로컬 char []로 복사하면 항상 운이 좋기를 바라고 있습니다. 실제 피해는 어디에서든지 실행할 수 있습니다. execute_job() 또는 30 분 전에 실행 한 것입니다.

Coverity와 같은 실수를 잡는 도구를 고려해보십시오.

관련 문제