初学者一枚!写了一个内存映射程序,程序报错,请各位大神给看看
菜鸟一枚!写了一个内存映射程序,程序报错,请各位大神给看看!
下面是报错:
LINK : error LNK2001: 无法解析的外部符号 _mainCRTStartup
1>F:\CPP_TN_BUF\trunk\Debug\CPP_TN_Buffer.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>
1>生成失败。
我是想写一个控制台程序,之前查了一些网上类似问题的回答,我推断应该是main的问题,但是我不知道怎么解决,希望大神们帮忙写一下,我学习学习,另外希望推荐一本关于这方面细节的书,我自己学习一下!谢谢各位了!
------解决思路----------------------
新建Windows Console Application空项目,添加该test.cpp到项目中。
------解决思路----------------------
顶楼上,建议创建空项目,一些特定的项目对main函数的参数有不同的要求。
nt _tmain(int argc, _TCHAR *argv[])
{
//TCHAR:_TCHAR,UNICODE:wchar_t,MBCS:char//字符串定义
//TCHAR:_T(""),UNICODE:L"",MBCS:""//字符串赋值
_TCHAR strMsgLog[MAX_PATH] = _T(""); //日志信息
//设定控制台颜色高亮白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if ((argc > 1) && ((*argv[1] == _T('-') || (*argv[1] == _T('/')))))
{
//TCHAR:_tcsicmp(),MBCS:mbsicmp(),UNICODE:wcsicmp()
//TCHAR:_tprintf(),MBCS:printf(),UNICODE:wprintf()
if (_tcsicmp(_T("install"), argv[1] + 1) == 0)
{
WritetoConsole(_T(">>This is the service install mode !"),0);
}
else if (_wcsicmp(_T("remove"), argv[1] + 1) == 0)
{
WritetoConsole(_T(">>This is the service remove mode !"),0);
}
else if (_wcsicmp(_T("regedit"), argv[1] + 1) == 0)
{
WritetoConsole(_T(">>This is the service regedit mode !"),0);
}
else if (_wcsicmp(_T("debug"), argv[1] + 1) == 0)
{
//此函数的第三个参数采用默认值可以省略
WritetoConsoleWithMode(_T(">>This is running with debug mode !"),0);
}
}
else//以服务方式启动
{
}
/***************************************************************************\
*函数名称 CreateFile
*函数功能 创建文件内核对象,其句柄保存于hFile
*参数列表 见下面的注释
*输入参数 见下面的注释
*输出参数 none
*返回值 返回文件句柄hFile
\***************************************************************************/
HANDLE hFile=CreateFile(
_T("FileN"), //IpFileName
GENERIC_READ|GENERIC_WRITE, //dwDesiredAccess
FILE_SHARE_READ|FILE_SHARE_WRITE, //dwShareMode
NULL, //IpSecurityAttributes
OPEN_ALWAYS, //dwCreationDisposition
FILE_ATTRIBUTE_NORMAL, //dwFilagsAndAttributes
NULL //hTemplateFile
);
if( hFile==INVALID_HANDLE_VALUE )
{
cout<<"没有成功打开文件";
return false;
}
/***************************************************************************\
*函数名称 CreateFileMapping
*函数功能 创建文件映射内核对象,句柄保存于hFileMapping
*参数列表 见下面的注释
*输入参数 见下面的注释
*输出参数 none
*返回值 返回文件句柄hFile
\***************************************************************************/
HANDLE hFileMapping=CreateFileMapping(
_T("hFile"), //HANDLE hFile物理文件句柄
NULL, //lpFileMappigAttributes安全设置
PAGE_READWRITE, //flProtect
0, //dwMaximumSizeHigh
0x4000000, //dwMaximumSizeLow
NULL //lpName
);
if(hFileMapping==NULL)
{
cout<<"没有成功创建文件句柄";
return false;
}
/***************************************************************************\
*函数名称 MapViewOfFile
*函数功能 创建文件映射内核对象,句柄保存于pvFileAddr
*参数列表 见下面的注释
*输入参数 见下面的注释
*输出参数 none
*返回值 返回文件句柄pvFileAddr
\***************************************************************************/
LPVOID pvFileAddr=MapViewOfFile(
hFileMapping,
FILE_MAP_WRITE,
0,
0x4000000,
0
);
/***************************************************************************\
*函数名称
*函数功能 释放映射内存
*参数列表 见下面的注释
*输入参数 见下面的注释
*输出参数 none
*返回值
\***************************************************************************/
UnmapViewOfFile(pvFileAddr);
CloseHandle(hFileMapping);
CloseHandle(hFile);
/***************************************************************************\
*函数名称 DeleteFile
*函数功能 删除指定的缓存文件。
*参数列表 LPCWSTR strCacheFileFullPath
*输入参数 LPCWSTR strCacheFileFullPath 删除的缓存文件的完整路径。
*输出参数 none
*返回值 BOOL 成功返回TRUE,失败返回FALSE。
\***************************************************************************/
DeleteFileW(_T("FileN")) ;
return 0;
}
下面是报错:
LINK : error LNK2001: 无法解析的外部符号 _mainCRTStartup
1>F:\CPP_TN_BUF\trunk\Debug\CPP_TN_Buffer.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>
1>生成失败。
我是想写一个控制台程序,之前查了一些网上类似问题的回答,我推断应该是main的问题,但是我不知道怎么解决,希望大神们帮忙写一下,我学习学习,另外希望推荐一本关于这方面细节的书,我自己学习一下!谢谢各位了!
------解决思路----------------------
新建Windows Console Application空项目,添加该test.cpp到项目中。
#include <windows.h>
#include <tchar.h>
#include <string.h>
#include <stdio.h>
void WritetoConsole(TCHAR *s,int) {
_tprintf(s);_tprintf(_T("\n"));
}
void WritetoConsoleWithMode(TCHAR *s,int) {
_tprintf(s);_tprintf(_T("\n"));
}
int _tmain(int argc, _TCHAR *argv[])
{
//TCHAR:_TCHAR,UNICODE:wchar_t,MBCS:char//字符串定义
//TCHAR:_T(""),UNICODE:L"",MBCS:""//字符串赋值
_TCHAR strMsgLog[MAX_PATH] = _T(""); //日志信息
//设定控制台颜色高亮白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_INTENSITY
------解决思路----------------------
FOREGROUND_RED
------解决思路----------------------
FOREGROUND_GREEN
------解决思路----------------------
FOREGROUND_BLUE);
if ((argc > 1) && ((*argv[1] == _T('-')
------解决思路----------------------
(*argv[1] == _T('/')))))
{
//TCHAR:_tcsicmp(),MBCS:mbsicmp(),UNICODE:wcsicmp()
//TCHAR:_tprintf(),MBCS:printf(),UNICODE:wprintf()
if (_tcsicmp(_T("install"), argv[1] + 1) == 0)
{
WritetoConsole(_T(">>This is the service install mode !"),0);
}
else if (_tcsicmp(_T("remove"), argv[1] + 1) == 0)
{
WritetoConsole(_T(">>This is the service remove mode !"),0);
}
else if (_tcsicmp(_T("regedit"), argv[1] + 1) == 0)
{
WritetoConsole(_T(">>This is the service regedit mode !"),0);
}
else if (_tcsicmp(_T("debug"), argv[1] + 1) == 0)
{
//此函数的第三个参数采用默认值可以省略
WritetoConsoleWithMode(_T(">>This is running with debug mode !"),0);
}
}
else//以服务方式启动
{
}
/***************************************************************************\
*函数名称 CreateFile
*函数功能 创建文件内核对象,其句柄保存于hFile
*参数列表 见下面的注释
*输入参数 见下面的注释
*输出参数 none
*返回值 返回文件句柄hFile
\***************************************************************************/
HANDLE hFile=CreateFile(
_T("FileN"), //IpFileName
GENERIC_READ
------解决思路----------------------
GENERIC_WRITE, //dwDesiredAccess
FILE_SHARE_READ
------解决思路----------------------
FILE_SHARE_WRITE, //dwShareMode
NULL, //IpSecurityAttributes
OPEN_ALWAYS, //dwCreationDisposition
FILE_ATTRIBUTE_NORMAL, //dwFilagsAndAttributes
NULL //hTemplateFile
);
if( hFile==INVALID_HANDLE_VALUE )
{
_tprintf(_T("没有成功打开文件\n"));;
return 1;
}
/***************************************************************************\
*函数名称 CreateFileMapping
*函数功能 创建文件映射内核对象,句柄保存于hFileMapping
*参数列表 见下面的注释
*输入参数 见下面的注释
*输出参数 none
*返回值 返回文件句柄hFile
\***************************************************************************/
HANDLE hFileMapping=CreateFileMapping(
_T("hFile"), //HANDLE hFile物理文件句柄
NULL, //lpFileMappigAttributes安全设置
PAGE_READWRITE, //flProtect
0, //dwMaximumSizeHigh
0x4000000, //dwMaximumSizeLow
NULL //lpName
);
if(hFileMapping==NULL)
{
_tprintf(_T("没有成功创建文件句柄\n"));
return 2;
}
/***************************************************************************\
*函数名称 MapViewOfFile
*函数功能 创建文件映射内核对象,句柄保存于pvFileAddr
*参数列表 见下面的注释
*输入参数 见下面的注释
*输出参数 none
*返回值 返回文件句柄pvFileAddr
\***************************************************************************/
LPVOID pvFileAddr=MapViewOfFile(
hFileMapping,
FILE_MAP_WRITE,
0,
0x4000000,
0
);
/***************************************************************************\
*函数名称
*函数功能 释放映射内存
*参数列表 见下面的注释
*输入参数 见下面的注释
*输出参数 none
*返回值
\***************************************************************************/
UnmapViewOfFile(pvFileAddr);
CloseHandle(hFileMapping);
CloseHandle(hFile);
/***************************************************************************\
*函数名称 DeleteFile
*函数功能 删除指定的缓存文件。
*参数列表 LPCWSTR strCacheFileFullPath
*输入参数 LPCWSTR strCacheFileFullPath 删除的缓存文件的完整路径。
*输出参数 none
*返回值 BOOL 成功返回TRUE,失败返回FALSE。
\***************************************************************************/
DeleteFile(_T("FileN")) ;
return 0;
}
------解决思路----------------------
顶楼上,建议创建空项目,一些特定的项目对main函数的参数有不同的要求。