日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

使用c#调用API函数CreateProcess来运行外部程序

發布時間:2025/5/22 C# 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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#中分別如下定義:

[StructLayout(LayoutKind.Sequential)]
????????
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来运行外部程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。