OutputDebugStringA 在/CLR工程中调用的c++的dll竟然有输出失败的情况?

时间:2022-09-01 17:53:43
上层C#,调用底层的c++库,c#与c++的中间API接口工程可以输出__FILE__等,但是底层c++的库,无论如何都不输出
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


引用 2 楼 zhao4zhong1 的回复:
使用depends.exe ?


你回答的可是及时啊
是我自己搞错函数了,必须使用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);

#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);
}

#1


c#与c++的中间API接口工程是支持/CLR

#2


使用depends.exe ?

#3


引用 2 楼 zhao4zhong1 的回复:
使用depends.exe ?


你回答的可是及时啊
是我自己搞错函数了,必须使用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);

#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);
}