我正在将现有的(主要)跨平台应用程序移植到WinCE 4.2。函数的当前入口点是
int main(int argc, char *argv[]){}
我希望保持这个部分的原样,并让WinCE入口点简单地调用它。我相信像下面这样的东西应该是有效的:
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
int argc = _tcslen(lpCmdLine);
char *argv = new char[argc];
wcstombs(argv,lpCmdLine,1024);
argc = main(argc,&argv);
delete [] argv;
return argc;
}
一旦我弄清楚链接器为什么会吐出来,它就会编译,并且应该会运行,但它是正确的吗?
发布于 2009-01-13 05:26:35
感谢你们两位的有用答案。我写了下面的代码,就像我们现在需要的那样。只有我们的代码会调用这个可执行文件,而且永远不会使用引号,尽管添加起来并不是很难。而且,如果参数之间有一个以上的空格,它可能不会做得很好,但再说一次,我们不必担心其他人使用这个程序,它只是出于学术目的。如果你认为改进是必要的,编辑这篇文章,并在你的评论中证明它的合理性。
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow ) {
assert(lpCmdLine != NULL);
int argc = 1, ret = 0;
std::vector<char*> args;
// Copy the entire array to a regular cstr
int cmdLineLen = _tcslen(lpCmdLine);
char *argv = new char[cmdLineLen];
wcstombs(argv,lpCmdLine,cmdLineLen);
args.push_back(&argv[0]);
// Replace spaces with nulls to effectively create array of cstr
for(int i=0; i<cmdLineLen; i++){
if(argv[i] == ' '){
argv[i] = '\0';
args.push_back(&argv[i+1]); // Keep track of the first char in each word
argc++;
}
}
// argv[argc] should be NULL.
args.push_back(NULL);
try{ // Run the program
ret = main(argc,&args[0]);
}
catch(...){
// TODO: Report error here. Commented code works OK for WinCE .NET
// delete argv;
// throw;
ret = -1;
}
delete argv;
return ret;
}
另外,对于那些感兴趣的人,可以在命令行中运行以下命令
>myprogam.exe -a shortargument -b -c
将把以下内容放入lpCmdLine
"-a shortargument -b -c"
另外,我的第一个猜测是delete[]需要被删除(因为我是新的char[]'d),但是当我这么做的时候,程序有一个致命的错误。当我切换到上面的时候,它工作了。这不是违反了新的->delete[]/new[]->delete[]规则吗?
发布于 2010-10-19 23:40:33
真正简单的方法是只需更改项目的链接器入口点,并使用main(...)函数。
打开项目属性对话框,然后转到"Linker->Advancedd“,并根据以下内容设置"Entry Point”值:
如果您的入口点是:
int main(int argc, char *argv[])
然后将入口点设置为mainACRTStartup
但是如果你是这样开始的:
int _tmain(int argc, TCHAR *argv[])
然后,入口点是mainWCRTStartup
发布于 2009-01-12 07:38:00
您的总体想法是正确的,但是您对lpCmdLine的转换可能会给您带来一些问题。请考虑以下几点:
$> myprogam.exe -a shortargument -b -c -d "long argument with spaces“
传递给main函数的参数如下所示:
argc = 7;
argv = {
"myprogram.exe",
"-a",
"shortargument",
"-b",
"-c",
"-d",
"long argument with spaces"
};
但是,WinMain将收到一个很长的字符串,如下所示:
lpCmdLine = "-a shortargument -b -c -d "long argument with spaces"";
因此,如果您有任何命令行选项解析正在进行,您可能会破坏它。最通用的方法是遍历lpCmdLine,将所有空格(当然不包括匹配的引号)设置为空字符(即'\0‘或仅为0),并跟踪指向空字符序列后第一个有效字符的指针。
添加:如果我没记错的话,当我做wince开发的时候,我似乎记得一些关于lpCmdLine的事情,只是为了与win32兼容,所以它总是空的。要获得命令行,我认为您必须使用GetCommandLine。
https://stackoverflow.com/questions/434702
复制相似问题