使用c#调用API函数CreateProcess来运行外部程序
c#調用CreateProcess函數比較麻煩的地方就是該函數的那些參數用c#的語法如何定義,CreateProcess函數位于Kernel32.dll中,原形如下:
BOOL CreateProcess(
? LPCTSTR lpApplicationName,
? LPTSTR lpCommandLine,
? LPSECURITY_ATTRIBUTES lpProcessAttributes,
? LPSECURITY_ATTRIBUTES lpThreadAttributes,
? BOOL bInheritHandles,
? DWORD dwCreationFlags,
? LPVOID lpEnvironment,
? LPCTSTR lpCurrentDirectory,
? LPSTARTUPINFO lpStartupInfo,
? LPPROCESS_INFORMATION lpProcessInformation
);
用c#語法聲明時,LPCTSTR,LBTSTR,LPVOID這三個類型我都把它定義為StringBuilder類型,DWORD定義為int類型,關鍵是這三個Struct該怎么定義;在c#中定義傳給API的Struct參數時,即可以將它定義為Struct也可以定義成class,于是我把LPSECURITY_ATTRIBUTES,LPSTARTUPINFO,LPPROCESS_INFORMATION 這三個Struct在c#中分別如下定義:
????????public?class?SECURITY_ATTRIBUTES
????????{
????????????public?int?nLength;??
????????????public?string?lpSecurityDescriptor;??
????????????public?bool?bInheritHandle;
????????}
[StructLayout(LayoutKind.Sequential)]
????????public?struct?STARTUPINFO
????????{
????????????public?int?cb;??
????????????public?string?lpReserved;??
????????????public?string?lpDesktop;??
????????????public?int?lpTitle;??
????????????public?int?dwX;??
????????????public?int?dwY;??
????????????public?int?dwXSize;??
????????????public?int?dwYSize;??
????????????public?int?dwXCountChars;??
????????????public?int?dwYCountChars;??
????????????public?int?dwFillAttribute;??
????????????public?int?dwFlags;??
????????????public?int?wShowWindow;??
????????????public?int?cbReserved2;??
????????????public?byte?lpReserved2;??
????????????public?IntPtr?hStdInput;??
????????????public?IntPtr?hStdOutput;??
????????????public?IntPtr?hStdError;
????????}
[StructLayout(LayoutKind.Sequential)]
????????public?struct?PROCESS_INFORMATION
????????{
????????????public?IntPtr?hProcess;??
????????????public?IntPtr?hThread;??
????????????public?int?dwProcessId;??
????????????public?int?dwThreadId;
????????}
這里我把LPSECURITY_ATTRIBUTES? 定義為class,主要是為了接下來傳null參數時方便些,下面是CreateProcess的聲明部分:
??[DllImport("Kernel32.dll",CharSet=CharSet.Ansi)]
??public static extern bool CreateProcess(StringBuilder lpApplicationName,StringBuilder lpCommandLine,
????????????????????????????????????????????????????????????? SECURITY_ATTRIBUTES lpProcessAttributes,
???????????????????????????????????????????????????????????? ?SECURITY_ATTRIBUTES lpThreadAttributes,
????????????????????????????????????????????????????????????? bool bInheritHandles,
????????????????????????????????????????????????????????????? int dwCreationFlags,
????????????????????????????????????????????????????????????? StringBuilder lpEnvironment,
?????????????????????????????? ?????????????????????????????? StringBuilder lpCurrentDirectory,
????????????????????????????????????????????????????????????? ref STARTUPINFO lpStartupInfo,
????????????????????????????????????????????????????????????? ref PROCESS_INFORMATION lpProcessInformation
????????????????????????????????????????????????????????????? );
最后兩個參數之所以在前面加上ref,是因為這兩個參數的值需要回傳.
在程序中使用CreateProcess:
string sCommand=@"isqlw /S "+TBServer.Text.Trim()+" /d "+TBDataBase.Text.Trim()+" /U "+TBUserName.Text.Trim()+
???????????????????????????? " /P "+TBPassWord.Text.Trim()+" /i "+sCurrtFile+" /o "+sProgramCurrectPath+sLogFile;
???StringBuilder sbCommand=new StringBuilder(1000);
???sbCommand.Append(sCommand);
???STARTUPINFO sInfo=new STARTUPINFO();
???PROCESS_INFORMATION pInfo=new PROCESS_INFORMATION();??
??????
???if (!CreateProcess(null,sbCommand,null,null,false,0,null,null,ref sInfo,ref pInfo))
???{
????throw new Exception("isqlw調用失敗["+sFileName+"]");
???}
???WaitForSingleObject(pInfo.hProcess,600000000);
???CloseHandle(pInfo.hProcess);
?? CloseHandle(pInfo.hThread);
這里用到了WaitForSingleObject函數,使用該函數的作用是讓CreateProcess創建的新進程與本程序的主進程同步執行,如果不加WaitForSingleObject則這兩個進程是異步執行的,該函數的第二個參數是設函數的超時時間(毫秒),如果設一個很大的值則表示直到第一個參數所指的進程執行結束,才能執行該函授后面的代碼;WaitForSingleObject的聲明如下:
? [DllImport("Kernel32.dll",CharSet=CharSet.Ansi)]
??public static extern int WaitForSingleObject(IntPtr hHandle,int dwMilliseconds);
CloseHandle申明如下:
??[DllImport("Kernel32.dll",CharSet=CharSet.Ansi)]
??public static extern bool CloseHandle(IntPtr hObject);
???
轉載于:https://www.cnblogs.com/DoNetBird/archive/2005/10/27/262921.html
總結
以上是生活随笔為你收集整理的使用c#调用API函数CreateProcess来运行外部程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC6中工具条的新特色
- 下一篇: 打造超大五笔词库