编写NSIS插件输出安装过程的日志

来源:互联网 发布:java调用ant脚本 参数 编辑:程序博客网 时间:2024/06/02 03:28

实现打印安装过程中的日志到临时目录的文件中。日志文件以年月日为文件名。

static void MakeTempFileName(char* buf, int bufSize){char TempPath[MAX_PATH] = {0};GetTempPathA(MAX_PATH,TempPath);StringCbCopyA(buf,bufSize,TempPath);char TempName[MAX_PATH] = {0};struct tm *local;time_t t;t = time(NULL);local = localtime(&t);StringCbPrintfA(TempName,sizeof(TempName),"%d-%d-%d.txt",local->tm_year,local->tm_mon,local->tm_mday);StringCbCatA(buf,bufSize,TempName);}static FILE* fp = NULL;extern "C" void __declspec(dllexport)Log(HWND hwndParent, int string_size,CHAR *variables, stack_t **stacktop,extra_parameters *extra){int iFunctionCode = 0;BOOL bValue = FALSE;//插件初始化g_hwndParent = hwndParent;EXDLL_INIT();//获取NSIS脚本传入的参数,检查有效性char sz[4096] = {0};memset(sz,0,sizeof(sz));struct tm *local;time_t t;t = time(NULL);local = localtime(&t);StringCbCopy(sz,sizeof(sz),asctime(local));StringCbCat(sz,sizeof(sz),"    ");popstring(sz + strlen(sz));StringCbCat(sz,sizeof(sz),"\r\n");//NSIS会频繁LoadLibary、FreeLibary。所以下面需要以追加方式写入。if (!fp){char szFilePath[MAX_PATH] = {0};MakeTempFileName(szFilePath,sizeof(szFilePath));fp = fopen(szFilePath,"ab");if (!fp){return;}}fwrite(sz,1,strlen(sz),fp);fflush(fp);//这一句可有可无}//这个函数需要在DLL_PROCESS_DETACH时调用它以关闭文件句柄。extern "C" void Uninitialize(){if (fp){fclose(fp);fp = NULL;}}

DLL被卸掉时保存文件,这里可能被多次调用。似乎NSIS每次调用一个插件的函数时都是LoadLibary,用完就FreeLibary

extern void Uninitialize();BOOL APIENTRY DllMain( HMODULE hModule,                       DWORD  ul_reason_for_call,                       LPVOID lpReserved ){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:break;case DLL_PROCESS_DETACH:Uninitialize();break;}return TRUE;}




0 0
原创粉丝点击