VSソフトウェアのデフォルトインストールパスの変更、CreateFileの戻り値が0 xffffffff、ファイル-Fileの処理に失敗し、持っていない.ps 1拡張子、管理者権限のあるcmdを呼び出す、正常に動作しない.exeかつ戻り値なし、bat管理者権限


今回のソフトウェア整理で発生した問題の整理
1、パッケージのデフォルトのインストールパスにスペースがある場合はどうすればいいですか
パッケージのデフォルトのインストールパスは、ソリューション--パッケージアイテム(**Setup)--右クリック--view-ファイル----APplication Folder--プロパティ、DefaultLocationのデフォルトは[ProgramFiles 64 Folder][Manufacturer][ProductName]で、ProgramFiles 64 FolderのデフォルトのCディスクのprogram files.
デフォルトのインストールパスを次の形式に変更します:C:SUNG
debugディレクトリの下のファイルは以下のディレクトリにインストールされます.
C:\WINDOWS

2 HIDを使用csは、まずFindUSBDEvice()を使用しなければ、直接OpenDevice()を開き、存在しないデバイスを開いた後、再び存在するデバイスを開く方法を発見した.
device = CreateFile(deviceList[i], DESIREDACCESS.GENERIC_READ | DESIREDACCESS.GENERIC_WRITE, 0, 0, CREATIONDISPOSITION.OPEN_EXISTING, 0x40000000, 0);
ここでの戻り値はいずれも0 xffffffである.
したがって、デバイスを開く前に、デバイス(FindUsbDevice)が存在するかどうかを確認し、存在しないデバイスを直接開くことはできません.
他のツールはcreatefile(デバイスのプロパティ値を変更してアクセスする)と競合する可能性があります.この問題が発生すると、デバイスマネージャで読み込まれたDeviceList()でプロパティにアクセスできないデバイスが削除され、createfileというデバイスではありません.
                //     deviceList      ,             
                for (int i = 0; i < deviceList.Count; )
                {
                    if(deviceList[i].IndexOf("vid_****&pid_****")>-1)
                    {
                        deviceList.RemoveAt(i);
                        //break;
                    }
                    else
                    {
                        i++;
                    }
                }

                for (int i = 0; i < deviceList.Count; i++){...
                }

3現象:ファイル-File"CProgram"-program fileの処理に失敗しました.ファイルがないためです.psl拡張子、有効なパスを指定してください.
ソフトウェアから1つ呼び出されました.batファイルは、ソフトウェアで正しく使用できます.ただし、ソフトウェアのインストール時にデフォルトパスで「C:Program Files」にインストール時に呼び出す.batファイルが失敗し、「C:Program」で対応するものが見つからないことを示す.ps 1ファイル.
原因:.batファイルはパスにスペースがあることを認識できません
ソリューション:上記の方法で、ソフトウェアのデフォルトのインストールパスを変更し、スペースのないパスにインストールすればいいです.
4管理者権限でcmdウィンドウを呼び出し、コマンド実行を入力できます.
先にreadmeを読み込む.txtの内容はlogに表示され、開いたcmdウィンドウで過去の実行命令をコピーできます.
        private void button_download_Click(object sender, EventArgs e)
        {
            FileOperation file_opt = new FileOperation();
            richTextBox1.Text += file_opt.Read(".\\readme.txt");
            richTextBox1.Text += "
"; // cmd , ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "cmd.exe"; startInfo.Arguments = "/c C:\\Windows\\System32\\cmd.exe"; startInfo.UseShellExecute = false; startInfo.Verb = "RunAs"; Process p = new System.Diagnostics.Process(); p.StartInfo = startInfo; p.Start(); }

使用する関数
    public class FileOperation
    {
        public string Read(string path)
        {
            StreamReader sr = new StreamReader(path);
            string strContent = sr.ReadToEnd();
            sr.Close();
            return strContent;
        }
    }

..
5プロセスを呼び出し、実行する.exeツール.
        private void GetConID()
        {
            Process p = new Process();

            p.StartInfo.FileName = ".\\Tool\\GConID.exe";

            p.StartInfo.Arguments = "GetConID";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.WorkingDirectory = Path.GetDirectoryName(p.StartInfo.FileName);
            p.StartInfo.Verb = "runas";

            p.StartInfo.CreateNoWindow = true;

            p.Start();
            string result = p.StandardOutput.ReadToEnd();

            if (result=="")
            {
                MessageBox.Show("ContainerID is empty");
            }
            else
            {
                //  conID  ,      {}  , -  ,         
                int fir = result.IndexOf("{", 0);
                int end = result.IndexOf("}", 0);
                string conID = result.Substring(fir + 1, end - fir - 1);
                conID = conID.Replace("-", "");
                form_log.richTextBox_logout.Text += "ConID: " + conID + "

"; Number_ContainerID.Text = containerID; } p.WaitForExit(); p.Close(); }

ファイルに遭遇し、他のファイルを呼び出す.exeの場合、増加はありません
p.StartInfo.WorkingDirectory = Path.GetDirectoryName(p.StartInfo.FileName);
p.StartInfo.Verb = "runas";
ただし、運転時に正常に動作せず、戻り値も得られないので、この2つの文を追加すればよい.
6编纂batファイルは、管理者権限の下でコマンドを実行させます.
全体batファイルのフォーマットは次のようになります.
cls
 @echo off
 title        
mode con cols=100 lines=20
 color 3f


::          
setlocal
 set uac=~uac_permission_tmp_%random%
 md "%SystemRoot%\system32\%uac%" 2>nul
 if %errorlevel%==0 ( rd "%SystemRoot%\system32\%uac%" >nul 2>nul ) else (
     echo set uac = CreateObject^("Shell.Application"^)>"%temp%\%uac%.vbs"
     echo uac.ShellExecute "%~s0","","","runas",1 >>"%temp%\%uac%.vbs"
     echo WScript.Quit >>"%temp%\%uac%.vbs"
     "%temp%\%uac%.vbs" /f
     del /f /q "%temp%\%uac%.vbs" & exit )
 endlocal
::     ,              


cd /d %~dp0  //       /d
::echo %cd%\  //      
::echo cd /d %%~dp0

Echo **Start Update**
cd prog   //  prog      
ping -n 1 127.0.0.1 >nul //   ping  
ping -n 1 127.0.0.1 >nul
prog.exe -fw %cd%\..\Firmware\Oasis\firmware\Factory\Oasis.img -dest SYSTEM  //    
ping -n 2 127.0.0.1 >nul
cd ..  //     
cd tek  //     tek   
ping -n 2 127.0.0.1 >nul
Caling.bat -BoardRev "RevA" -PresenceVid 0x04E8  -PresencePage

7、管理者権限の下で実行する.batスクリプト、パラメータが相対パスのファイルである場合、プロンプトパラメータは無効です.
例:prog.exe -fw  %cd%\..\Fware\Oas\fware\Factory\Oasis.ini -dest SYSTEM
ここでは%cd%を用い,決定経路を用いてパラメータを有効パラメータとした.
8、管理者権限呼び出しcmd.exe、exeファイルを実行
              cmd  ,      
            ProcessStartInfo startInfo = new ProcessStartInfo();
            //startInfo.FileName = ".\\Tools\\cleanup\\cleanup.cmd";
            startInfo.FileName = "cmd.exe";
            startInfo.Arguments = "/c C:\\Windows\\System32\\cmd.exe";
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardInput = true;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            //startInfo.CreateNoWindow = true;
            startInfo.Verb = "RunAs";

            Process p = new System.Diagnostics.Process();
            p.StartInfo = startInfo;

            p.Start();
            p.StandardInput.WriteLine(".\\Tools\\cleanup\\cleanup.cmd");//  p.StandardInput.WriteLine("exit");      
            p.StandardInput.AutoFlush = true;


            string result = p.StandardOutput.ReadToEnd();
            richTextBox_logout.Text += result + "

";

9、labelコントロールの背景を透明に設定し、その位置を設定します.
コントロールlabe 1を選択し、BackColorをTransparentに設定します.
コードではlabel 1.Parent=picture_Background;//ここでの背景色はUI全体の背景色である.
label.Location=new Point(12,34);//コントロールの元の属性に元の位置があるので、調整を参照してください.
..
.