您的位置:首页 > 编程语言 > C语言/C++

C/C++ 由fopen_s引发的问题

2012-09-09 18:04 225 查看
fopen_s是个安全函数,实在是太安全了。o(︶︿︶)o 唉。使用要非常小心哦。

一个小程序,获取模块自身路径。

char* Get_Current_Dll_Moudle_Task_Path(char* name)
{
	HMODULE hMod = GetModuleHandle(_T(name));
	if(hMod != NULL)
	{
		TCHAR szBuffer[MAX_PATH] = {0};
		GetModuleFileName(hMod, szBuffer, sizeof(szBuffer) / sizeof(TCHAR) - 1);
		(strrchr(szBuffer, '\\'))[0] = 0;
		char *task_txt = szBuffer;
		return task_txt;
	}

}


返回自身模块的路径char *类型

带进fopen_s

FILE * fp;
	fopen_s(&fp,task_txt,"r");                               //这里的task_txt就是上面函数的指针
	while(fgets(data,MAX_PATH,fp) != NULL)
	{       
       }
这样的代码在控制台,或者DLL工程自身的主线程里没有问题,可放到线程里去就立马出错

解决办法:

task_txt = Get_Current_Dll_Moudle_Task_Path("task.dll");
	OutputDebugString(task_txt);
	char txt[MAX_PATH] ={0};
	strcpy_s(txt,sizeof(txt),task_txt);
	OutputDebugString(txt);
	FILE * fp;
	fopen_s(&fp,txt,"r");
	char data[MAX_PATH]={0};   
	while(fgets(data,MAX_PATH,fp) != NULL)


把指针赋值给字符串数组就可以。减少指针操作。造成空指针崩溃!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: