允许表单接受命令行参数

时间:2013-05-20 21:36:26

标签: c++ winforms command-line command-line-arguments

我有一个应用程序,现在有一个可以加载的设置文件。我希望为用户提供的一个所需功能是能够双击我创建的特定文件类型并让应用程序打开该文件。

据我所知,这意味着当用户双击应用程序时,双击的文件将其完整路径作为cmdline参数传递给我的应用程序。

为了加载此文件,我尝试在Form1.cpp文件中执行以下操作:

#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
//Command Line Args
#include <shellapi.h>

using namespace JohnDeereDataqGUI;

int APIENTRY _tWinMain(HINSTANCE hInstance,
                 HINSTANCE hPrevInstance,
                 LPTSTR    lpCmdLine,
                 int       nCmdShow)
{
System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
int argCount;
LPWSTR * argList;
argList = CommandLineToArgvW(GetCommandLineW(), &argCount);
Application::Run(new Form1(argList[0]));
LocalFree(argList);
return 0;
}

对于我的构造函数:

public:
    Form1(String * argument)
    {
        InitializeComponent();
        if(argument)
            loadPreviousSettings((const char *)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(argument));
    }

目前,当我双击指定类型的文件时,文件无法加载。我的应用程序加载,但设置被设置为默认值,而不是存储在应该加载的文件中的自定义设置。此外,我在尝试调试时遇到问题,因为我无法在调试模式下运行应用程序,然后双击计算机上的文件,因为它启动了一个单独的.exe,当然不会遇到断点。

我想知道问题可能是什么和/或是否有更简单的方法来执行此操作。

注意:

我在Visual Studio 2003中编写此代码,因此可能无法在以后的版本中使用某些操作。

1 个答案:

答案 0 :(得分:1)

我只需要传递参数[1]而不是参数[0],因为[0]是应用程序的路径,[1]是我传递的文件。简单的错误。

最终解决方案:

#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
//Command Line Args
#include <shellapi.h>

using namespace JohnDeereDataqGUI;

int APIENTRY _tWinMain(HINSTANCE hInstance,
                 HINSTANCE hPrevInstance,
                 LPTSTR    lpCmdLine,
                 int       nCmdShow)
{
System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
int argCount;
LPWSTR * argList;
argList = CommandLineToArgvW(GetCommandLineW(), &argCount);
if( argCount > 1)
    Application::Run(new Form1(argList[1]));
else
    Application::Run(new Form1());
LocalFree(argList);
return 0;
 }

 Form1(String * argument)
    {
        InitializeComponent();
        if(argument)
            loadPreviousSettings((const char *)(void*)     System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(argument));
    }
    Form1(void)
    {
        InitializeComponent();
    }