首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Normal main到WinCE main

Normal main到WinCE main
EN

Stack Overflow用户
提问于 2009-01-12 07:23:24
回答 4查看 3.5K关注 0票数 2

我正在将现有的(主要)跨平台应用程序移植到WinCE 4.2。函数的当前入口点是

代码语言:javascript
运行
复制
int main(int argc, char *argv[]){}

我希望保持这个部分的原样,并让WinCE入口点简单地调用它。我相信像下面这样的东西应该是有效的:

代码语言:javascript
运行
复制
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;
}

一旦我弄清楚链接器为什么会吐出来,它就会编译,并且应该会运行,但它是正确的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-13 05:26:35

感谢你们两位的有用答案。我写了下面的代码,就像我们现在需要的那样。只有我们的代码会调用这个可执行文件,而且永远不会使用引号,尽管添加起来并不是很难。而且,如果参数之间有一个以上的空格,它可能不会做得很好,但再说一次,我们不必担心其他人使用这个程序,它只是出于学术目的。如果你认为改进是必要的,编辑这篇文章,并在你的评论中证明它的合理性。

代码语言:javascript
运行
复制
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;
}

另外,对于那些感兴趣的人,可以在命令行中运行以下命令

代码语言:javascript
运行
复制
>myprogam.exe -a shortargument -b -c

将把以下内容放入lpCmdLine

代码语言:javascript
运行
复制
"-a shortargument -b -c"

另外,我的第一个猜测是delete[]需要被删除(因为我是新的char[]'d),但是当我这么做的时候,程序有一个致命的错误。当我切换到上面的时候,它工作了。这不是违反了新的->delete[]/new[]->delete[]规则吗?

票数 2
EN

Stack Overflow用户

发布于 2010-10-19 23:40:33

真正简单的方法是只需更改项目的链接器入口点,并使用main(...)函数。

打开项目属性对话框,然后转到"Linker->Advancedd“,并根据以下内容设置"Entry Point”值:

如果您的入口点是:

代码语言:javascript
运行
复制
int main(int argc, char *argv[])

然后将入口点设置为mainACRTStartup

但是如果你是这样开始的:

代码语言:javascript
运行
复制
int _tmain(int argc, TCHAR *argv[])

然后,入口点是mainWCRTStartup

票数 5
EN

Stack Overflow用户

发布于 2009-01-12 07:38:00

您的总体想法是正确的,但是您对lpCmdLine的转换可能会给您带来一些问题。请考虑以下几点:

$> myprogam.exe -a shortargument -b -c -d "long argument with spaces“

传递给main函数的参数如下所示:

代码语言:javascript
运行
复制
argc = 7;
argv = {
    "myprogram.exe",
    "-a",
    "shortargument",
    "-b",
    "-c",
    "-d",
    "long argument with spaces"
};

但是,WinMain将收到一个很长的字符串,如下所示:

代码语言:javascript
运行
复制
lpCmdLine = "-a shortargument -b -c -d "long argument with spaces"";

因此,如果您有任何命令行选项解析正在进行,您可能会破坏它。最通用的方法是遍历lpCmdLine,将所有空格(当然不包括匹配的引号)设置为空字符(即'\0‘或仅为0),并跟踪指向空字符序列后第一个有效字符的指针。

添加:如果我没记错的话,当我做wince开发的时候,我似乎记得一些关于lpCmdLine的事情,只是为了与win32兼容,所以它总是空的。要获得命令行,我认为您必须使用GetCommandLine

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/434702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档