debugview应该没问题,其它消息一直在打印
OutputDebugStringA 换成OutputDebugStringW ,也不行
void DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat,...)
{
char arr[1000] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf_s(arr, 25, "%4d-%02d-%02d %02d:%02d:%02d.%03d", sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds);
sprintf_s(&arr[23], sizeof(arr)-23, " %s %s:%d\n", pFile,pFun,line);
OutputDebugStringA(arr); 这条语句在底层库无论如何打印不出来
va_list pArgList;
va_start (pArgList, pFormat);
sprintf_s(arr,sizeof(arr),pFormat,pArgList);
va_end (pArgList);
OutputDebugStringA(arr); 这条可以打印pFormat的内容,但是通过pArgList传过来的参数全是错误的,不知道为什么
}
void LOG_DLL_EXPORT DbgPrintString(const char*pFile, const char* pFun, const int line, const char* pFormat,...);
#define DbgPrintStr(pFormat,...) DbgPrintString(__FILE__, __FUNCTION__, __LINE__, pFormat, ##__VA_ARGS__);
上面在/clr工程里面工作正常,但是纯c++工程的底层dll缺不正常。
请问问题出在哪里?
5 个解决方案
#1
c#与c++的中间API接口工程是支持/CLR
#2
使用depends.exe ?
#3
你回答的可是及时啊
是我自己搞错函数了,必须使用vsnprintf这个函数,或vs开头的,专门针对于va_list 的函数
va_list pArgList = NULL;
va_start (pArgList, pFormat);
vsnprintf(arr,sizeof(arr),pFormat,pArgList);
va_end (pArgList);
另外,第一个函数打印不出来,是我用了debugview的过滤功能,艹,这么弱智的问题,害的我两天找来找去,又变成Unicode等都不行,现在彻底搞好了。
下面贴出来共享给大家
#4
#define DebugPrintDir
#ifdef DebugPrint // 不带文件路径,输出到共享内存的打印,用DebugView或VS的即时窗口看
#define DbgPrintStr(pFormat,...) DbgPrintString(strrchr(__FILE__,'\\')?strrchr(__FILE__,'\\')+1:__FILE__, __FUNCTION__, __LINE__, pFormat, ##__VA_ARGS__);
#elif defined DebugPrintDir // 带路径
#define DbgPrintStr(pFormat,...) DbgPrintString(__FILE__, __FUNCTION__, __LINE__, pFormat, ##__VA_ARGS__);
#else
#define DbgPrintStr(pFormat,...)
#endif
// 这个函数主要通过共享内存打印到系统信息里面,具有实时性,保证即便崩溃的时候也能通过DebugView查看到打印的信息
void LOG_DLL_EXPORT DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat,...);
void DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat,...)
{
char arr[300] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf_s(arr, 25, "%4d-%02d-%02d %02d:%02d:%02d.%03d", sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds);
sprintf_s(&arr[23], sizeof(arr)-23, " %s %s:%d\n", pFile,pFun,line);
OutputDebugStringA(arr);
va_list pArgList = NULL;
va_start (pArgList, pFormat);
vsnprintf(arr,sizeof(arr),pFormat,pArgList);
va_end (pArgList);
OutputDebugStringA(arr);
}
上面定义了一个宏,导入时间、文件名、函数名和行号,外加输入的格式化信息,调用类似格式:
DbgPrintStr("XXX 15 datalen:%d\n", datalen);
#ifdef DebugPrint // 不带文件路径,输出到共享内存的打印,用DebugView或VS的即时窗口看
#define DbgPrintStr(pFormat,...) DbgPrintString(strrchr(__FILE__,'\\')?strrchr(__FILE__,'\\')+1:__FILE__, __FUNCTION__, __LINE__, pFormat, ##__VA_ARGS__);
#elif defined DebugPrintDir // 带路径
#define DbgPrintStr(pFormat,...) DbgPrintString(__FILE__, __FUNCTION__, __LINE__, pFormat, ##__VA_ARGS__);
#else
#define DbgPrintStr(pFormat,...)
#endif
// 这个函数主要通过共享内存打印到系统信息里面,具有实时性,保证即便崩溃的时候也能通过DebugView查看到打印的信息
void LOG_DLL_EXPORT DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat,...);
void DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat,...)
{
char arr[300] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf_s(arr, 25, "%4d-%02d-%02d %02d:%02d:%02d.%03d", sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds);
sprintf_s(&arr[23], sizeof(arr)-23, " %s %s:%d\n", pFile,pFun,line);
OutputDebugStringA(arr);
va_list pArgList = NULL;
va_start (pArgList, pFormat);
vsnprintf(arr,sizeof(arr),pFormat,pArgList);
va_end (pArgList);
OutputDebugStringA(arr);
}
上面定义了一个宏,导入时间、文件名、函数名和行号,外加输入的格式化信息,调用类似格式:
DbgPrintStr("XXX 15 datalen:%d\n", datalen);
#5
针对debugview中每个打印都换行,下面采用一条输出语句,前半部的字符串长度也自适应了
void DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat, ...)
{
char arr[300] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf_s(arr, sizeof(arr), "%4d-%02d-%02d %02d:%02d:%02d.%03d <%s> %s:%d ", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, pFile, pFun, line);
va_list pArgList = NULL;
va_start(pArgList, pFormat);
vsnprintf(&arr[strlen(arr)], sizeof(arr)- strlen(arr), pFormat, pArgList);
va_end(pArgList);
OutputDebugStringA(arr);
}
void DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat, ...)
{
char arr[300] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf_s(arr, sizeof(arr), "%4d-%02d-%02d %02d:%02d:%02d.%03d <%s> %s:%d ", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, pFile, pFun, line);
va_list pArgList = NULL;
va_start(pArgList, pFormat);
vsnprintf(&arr[strlen(arr)], sizeof(arr)- strlen(arr), pFormat, pArgList);
va_end(pArgList);
OutputDebugStringA(arr);
}
#1
c#与c++的中间API接口工程是支持/CLR
#2
使用depends.exe ?
#3
你回答的可是及时啊
是我自己搞错函数了,必须使用vsnprintf这个函数,或vs开头的,专门针对于va_list 的函数
va_list pArgList = NULL;
va_start (pArgList, pFormat);
vsnprintf(arr,sizeof(arr),pFormat,pArgList);
va_end (pArgList);
另外,第一个函数打印不出来,是我用了debugview的过滤功能,艹,这么弱智的问题,害的我两天找来找去,又变成Unicode等都不行,现在彻底搞好了。
下面贴出来共享给大家
#4
#define DebugPrintDir
#ifdef DebugPrint // 不带文件路径,输出到共享内存的打印,用DebugView或VS的即时窗口看
#define DbgPrintStr(pFormat,...) DbgPrintString(strrchr(__FILE__,'\\')?strrchr(__FILE__,'\\')+1:__FILE__, __FUNCTION__, __LINE__, pFormat, ##__VA_ARGS__);
#elif defined DebugPrintDir // 带路径
#define DbgPrintStr(pFormat,...) DbgPrintString(__FILE__, __FUNCTION__, __LINE__, pFormat, ##__VA_ARGS__);
#else
#define DbgPrintStr(pFormat,...)
#endif
// 这个函数主要通过共享内存打印到系统信息里面,具有实时性,保证即便崩溃的时候也能通过DebugView查看到打印的信息
void LOG_DLL_EXPORT DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat,...);
void DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat,...)
{
char arr[300] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf_s(arr, 25, "%4d-%02d-%02d %02d:%02d:%02d.%03d", sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds);
sprintf_s(&arr[23], sizeof(arr)-23, " %s %s:%d\n", pFile,pFun,line);
OutputDebugStringA(arr);
va_list pArgList = NULL;
va_start (pArgList, pFormat);
vsnprintf(arr,sizeof(arr),pFormat,pArgList);
va_end (pArgList);
OutputDebugStringA(arr);
}
上面定义了一个宏,导入时间、文件名、函数名和行号,外加输入的格式化信息,调用类似格式:
DbgPrintStr("XXX 15 datalen:%d\n", datalen);
#ifdef DebugPrint // 不带文件路径,输出到共享内存的打印,用DebugView或VS的即时窗口看
#define DbgPrintStr(pFormat,...) DbgPrintString(strrchr(__FILE__,'\\')?strrchr(__FILE__,'\\')+1:__FILE__, __FUNCTION__, __LINE__, pFormat, ##__VA_ARGS__);
#elif defined DebugPrintDir // 带路径
#define DbgPrintStr(pFormat,...) DbgPrintString(__FILE__, __FUNCTION__, __LINE__, pFormat, ##__VA_ARGS__);
#else
#define DbgPrintStr(pFormat,...)
#endif
// 这个函数主要通过共享内存打印到系统信息里面,具有实时性,保证即便崩溃的时候也能通过DebugView查看到打印的信息
void LOG_DLL_EXPORT DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat,...);
void DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat,...)
{
char arr[300] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf_s(arr, 25, "%4d-%02d-%02d %02d:%02d:%02d.%03d", sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds);
sprintf_s(&arr[23], sizeof(arr)-23, " %s %s:%d\n", pFile,pFun,line);
OutputDebugStringA(arr);
va_list pArgList = NULL;
va_start (pArgList, pFormat);
vsnprintf(arr,sizeof(arr),pFormat,pArgList);
va_end (pArgList);
OutputDebugStringA(arr);
}
上面定义了一个宏,导入时间、文件名、函数名和行号,外加输入的格式化信息,调用类似格式:
DbgPrintStr("XXX 15 datalen:%d\n", datalen);
#5
针对debugview中每个打印都换行,下面采用一条输出语句,前半部的字符串长度也自适应了
void DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat, ...)
{
char arr[300] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf_s(arr, sizeof(arr), "%4d-%02d-%02d %02d:%02d:%02d.%03d <%s> %s:%d ", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, pFile, pFun, line);
va_list pArgList = NULL;
va_start(pArgList, pFormat);
vsnprintf(&arr[strlen(arr)], sizeof(arr)- strlen(arr), pFormat, pArgList);
va_end(pArgList);
OutputDebugStringA(arr);
}
void DbgPrintString(const char* pFile, const char* pFun, const int line, const char* pFormat, ...)
{
char arr[300] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf_s(arr, sizeof(arr), "%4d-%02d-%02d %02d:%02d:%02d.%03d <%s> %s:%d ", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, pFile, pFun, line);
va_list pArgList = NULL;
va_start(pArgList, pFormat);
vsnprintf(&arr[strlen(arr)], sizeof(arr)- strlen(arr), pFormat, pArgList);
va_end(pArgList);
OutputDebugStringA(arr);
}