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

zlc990405 2017-06-01 10:00:18
上层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缺不正常。
请问问题出在哪里?
...全文
336 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-06-02
  • 打赏
  • 举报
回复
使用depends.exe ?
zlc990405 2017-06-02
  • 打赏
  • 举报
回复
针对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); }
zlc990405 2017-06-02
  • 打赏
  • 举报
回复
#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);
zlc990405 2017-06-02
  • 打赏
  • 举报
回复
引用 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等都不行,现在彻底搞好了。 下面贴出来共享给大家
zlc990405 2017-06-01
  • 打赏
  • 举报
回复
c#与c++的中间API接口工程是支持/CLR

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧