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;
}
다시 말하면, 많은 아이디어가 많이 감사하겠습니다.