从Visual C ++ 2005 DLL启动.exe

时间:2009-03-29 11:25:01

标签: visual-c++ windows-mobile compact-framework pinvoke

有没有人知道代码或者有关如何使用visual c ++ 2005启动exe的想法。

如果是Windows Mobile,则dll所处的环境。使用P / Invoke执行此操作的c#是

[的DllImport( “coredll.dll中”)] private static extern int CreateProcess(string strImageName,string strCmdLine,IntPtr pProcessAttributes,IntPtr pThreadAttributes,int bInheritsHandle,int dwCreationFlags,IntPtr pEnvironment,IntPtr pCurrentDir,Byte [] bArray,ProcessInfo oProc);

// c#代码启动.exe CreateProcess(“\ Program Files \ myprogram \ myprogram.exe.exe”,“”,IntPtr.Zero,IntPtr.Zero,0,0,IntPtr.Zero,IntPtr.Zero,new Byte [128],pi);

我在C ++中需要它的原因是因为在运行自定义cab安装程序时,我被迫使用本机dll执行前后检查等。

非常感谢您的想法。 贝

3 个答案:

答案 0 :(得分:1)

PROCESS_INFORMATION ProcessInfo = { 0 };

if (CreateProcess(ImagePath,
                  NULL,
                  NULL,
                  NULL,
                  FALSE,
                  0,
                  NULL,
                  NULL,
                  NULL,
                  &ProcessInfo))
{
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
}
else
{
    return GetLastError();
}

答案 1 :(得分:0)

如果您的意思是在设备上运行exe,那么没有Visual Studio无法直接执行。您需要设置自定义构建步骤或前/后构建步骤来运行将为您执行此操作的应用程序。您可以使用WM5 SDK代码示例prun(或创建自己的代码示例)。 PRun使用RAPI在设备上运行应用程序,因此需要通过ActiveSync连接设备才能使其正常工作。

如果您尝试在设备上“自动”生成内容(例如,单元测试),您可能会考虑运行device emulator。与尝试使用物理设备相比,这可能会使您control更多。

答案 2 :(得分:0)

试试这个:

BOOL RunExe(CString strFile)
{
    WIN32_FIND_DATA fd;
    HANDLE      hFind;
    BOOL        bFind;

    hFind = FindFirstFile(strFile, &fd);
    bFind = (hFind != INVALID_HANDLE_VALUE);

    if(bFind)
    {
    if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
    {
        SHELLEXECUTEINFO info;
        ZeroMemory(&info, sizeof(info));
        info.cbSize = sizeof(info);
        info.fMask = SEE_MASK_NOCLOSEPROCESS;
        info.hwnd = 0;
        info.lpVerb = _T("open");
        info.lpFile = strFile;
        info.lpParameters = NULL;
        info.lpDirectory = NULL;
        info.nShow = SW_SHOW;
        info.hInstApp = NULL;
        ShellExecuteEx(&info);  
    }
    else
        bFind = FALSE;
    }

    FindClose(hFind);

    return bFind;    
}