• C++或C#调用外部exe的分析


    假如有个外部程序名为A.exe,放在目录E: emp下,然后我们用C++或者C#写一个程序调用这个A.exe的话(假设这个调用者所在的路径在D:invoke),通常会采用下面的代码:

    // C# code
    
    string exeName = @"E:	empA.exe";
    Process g = new Process();
    g.StartInfo.UseShellExecute = false;
    g.StartInfo.RedirectStandardOutput = false;
    g.StartInfo.FileName = exeName;
    g.StartInfo.CreateNoWindow = false;
    g.StartInfo.Arguments = "-R";          // Supposing there is a "-R" parameter
    g.Start();
    g.WaitForExit();
    // C++ code
    
    SHELLEXECUTEINFO  ShExecInfo  =  {0}; 
    ShExecInfo.cbSize        =  sizeof(SHELLEXECUTEINFO); 
    ShExecInfo.fMask        =  SEE_MASK_NOCLOSEPROCESS; 
    ShExecInfo.hwnd        =  NULL; 
    ShExecInfo.lpVerb        =  TEXT("open"); 
    ShExecInfo.lpFile        =  TEXT("E:\temp\A.exe"); 
    ShExecInfo.lpParameters     =  TEXT("-R");
    ShExecInfo.nShow        =  SW_HIDE; 
    ShExecInfo.hInstApp        =  NULL;   
    ShellExecuteEx(&ShExecInfo);
    WaitCursorBegin();
    WaitForSingleObject(ShExecInfo.hProcess, INFINITE);

    但是当我们的A.exe程序中使用相对路径创建或者打开文件时,就会发现用上面程序调用A.exe时,会提示无法创建文件或者无法打开文件,其原因是:

    1. A.exe的调用者和A.exe不在同一个目录下;
    2. 当异地调用A.exe时,A.exe程序里的相对路径都是相对于其调用者所在的目录而言(都是相对于D:invoke)

    解决办法很简单:

    1. C#代码中,加入g.StartInfo.WorkingDirectory = @"E: emp";
    2. C++代码中,加入ShExecInfo.lpDirectory  =  TEXT("E:\temp\");
    3. 上面两行代码的作用是指定A.exe运行的目录,这样就保证了A.exe里面使用的相对于路径是相对于A.exe所在的目录,即E: emp
  • 相关阅读:
    在vscode中显示空格和tab符号
    如何正确理解关键字"with"与上下文管理器
    HADOOP基本操作命令
    Ganglia环境搭建并监控Hadoop分布式集群
    关于分布式系统的数据一致性问题
    hadoop snapshot 备份恢复 .
    hadoop主节点(NameNode)备份策略以及恢复方法
    HDFS snapshot操作实战
    从 secondarynamenode 中恢复 namenode
    hadoop 通过distcp进行并行复制
  • 原文地址:https://www.cnblogs.com/cnpirate/p/7200567.html
Copyright © 2020-2023  润新知