在項目開發過程中,有時會需要用到調用第三方程序實現本系統的某一些功能,例如本文中需要使用到的swftools插件,那么如何在程序中使用這個插件,并且該插件是如何將PDF文件轉化為SWF文件的呢?接下來就會做一個簡單的介紹。
在.NET平臺中,對C#提供了一個操作對本地和遠程的訪問進程,使能夠啟動和停止系統進程。這個類就是System.Diagnostics.Process,我們首先來了解一下該類。
一.解析System.Diagnostics.Process類
在C#中使用Process類可以提供對本地和遠程的訪問進程,使能夠啟動和停止系統進程,并且該類可以對系統進程進行管理。該類中的一些常用方法:Start() ,Kill(),WaitForExit()等方法;StartInfo,FileName,CreateNoWindow等屬性。
1.Start()方法:啟動(或重用)此 Process 組件的 StartInfo 屬性指定的進程資源,并將其與該組件關聯。如果啟動了進程資源,則為 true;如果沒有啟動新的進程資源(例如,如果重用了現有進程),則為 false。
具體介紹一下該方法的實現代碼:
/// <devdoc> /// <para> /// <see cref='System.Diagnostics.Process'/>如果過程資源被重用而不是啟動,重用的進程與此相關聯<see cref ='System.Diagnostics.Process'/>零件。 /// </para> /// </devdoc> [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public bool Start() { Close(); ProcessStartInfo startInfo = StartInfo; if (startInfo.FileName.Length == 0) throw new InvalidOperationException(SR.GetString(SR.FileNameMissing)); if (startInfo.UseShellExecute) {#if !FEATURE_PAL return StartWithShellExecuteEx(startInfo); #else throw new InvalidOperationException(SR.GetString(SR.net_perm_invalid_val, "StartInfo.UseShellExecute", true)); #endif // !FEATURE_PAL } else { return StartWithCreateProcess(startInfo); } }2.Kill()方法:立即停止關聯的進程。Kill 強制終止進程,Kill 方法將異步執行。 在調用 Kill 方法后,請調用 WaitForExit 方法等待進程退出,或者檢查 HasExited 屬性以確定進程是否已經退出。
具體介紹一下該方法的實現代碼:
[ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] public void Kill() { SafeProcessHandle handle = null; try { handle = GetProcessHandle(NativeMethods.PROCESS_TERMINATE); if (!NativeMethods.TerminateProcess(handle, -1)) throw new Win32Exception(); } finally { ReleaseProcessHandle(handle); } }SafeProcessHandle GetProcessHandle(int access) { return GetProcessHandle(access, true); } /// <devdoc> /// 獲取進程的短期句柄,具有給定的訪問權限。 ///如果句柄存儲在當前進程對象中,則使用它。 ///注意,我們存儲在當前進程對象中的句柄將具有我們需要的所有訪問權限。 /// </devdoc> /// <internalonly/> [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] SafeProcessHandle GetProcessHandle(int access, bool throwIfExited) { Debug.WriteLineIf(processTracing.TraceVerbose, "GetProcessHandle(access = 0x" + access.ToString("X8", CultureInfo.InvariantCulture) + ", throwIfExited = " + throwIfExited + ")");#if DEBUG if (processTracing.TraceVerbose) { StackFrame calledFrom = new StackTrace(true).GetFrame(0); Debug.WriteLine(" called from " + calledFrom.GetFileName() + ", line " + calledFrom.GetFileLineNumber()); } #endif if (haveProcessHandle) { if (throwIfExited) { //因為hasProcessHandle是true,我們知道我們有進程句柄 //打開時至少要有SYNCHRONIZE訪問,所以我們可以等待它 // zero timeout以查看進程是否已退出。 ProcessWaitHandle waitHandle = null; try { waitHandle = new ProcessWaitHandle(m_processHandle); if (waitHandle.WaitOne(0, false)) { if (haveProcessId) throw new InvalidOperationException(SR.GetString(SR.ProcessHasExited, processId.ToString(CultureInfo.CurrentCulture))); else throw new InvalidOperationException(SR.GetString(SR.ProcessHasExitedNoId)); } } finally { if( waitHandle != null) { waitHandle.Close(); } } } return m_processHandle; } else { EnsureState(State.HaveId | State.IsLocal); SafeProcessHandle handle = SafeProcessHandle.InvalidHandle; #if !FEATURE_PAL handle = ProcessManager.OpenProcess(processId, access, throwIfExited); #else IntPtr pseudohandle = NativeMethods.GetCurrentProcess(); // Get a real handle if (!NativeMethods.DuplicateHandle (new HandleRef(this, pseudohandle), new HandleRef(this, pseudohandle), new HandleRef(this, pseudohandle), out handle, 0, false, NativeMethods.DUPLICATE_SAME_ACCESS | NativeMethods.DUPLICATE_CLOSE_SOURCE)) { throw new Win32Exception(); } #endif // !FEATURE_PAL if (throwIfExited && (access & NativeMethods.PROCESS_QUERY_INFORMATION) != 0) { if (NativeMethods.GetExitCodeProcess(handle, out exitCode) && exitCode != NativeMethods.STILL_ACTIVE) { throw new InvalidOperationException(SR.GetString(SR.ProcessHasExited, processId.ToString(CultureInfo.CurrentCulture))); } } return handle; } }3.WaitForExit()方法:指示<see cref ='System.Diagnostics.Process'/>組件等待指定的毫秒數,以使相關聯的進程退出。
具體介紹一下該方法的實現代碼:
public bool WaitForExit(int milliseconds) { SafeProcessHandle handle = null; bool exited; ProcessWaitHandle processWaitHandle = null; try { handle = GetProcessHandle(NativeMethods.SYNCHRONIZE, false); if (handle.IsInvalid) { exited = true; } else { processWaitHandle = new ProcessWaitHandle(handle); if( processWaitHandle.WaitOne(milliseconds, false)) { exited = true; signaled = true; } else { exited = false; signaled = false; } } } finally { if( processWaitHandle != null) { processWaitHandle.Close(); } // If we have a hard timeout, we cannot wait for the streams if( output != null && milliseconds == -1) { output.WaitUtilEOF(); } if( error != null && milliseconds == -1) { error.WaitUtilEOF(); } ReleaseProcessHandle(handle); } if (exited && watchForExit) { RaiseOnExited(); } return exited; }internal ProcessWaitHandle( SafeProcessHandle processHandle): base() { SafeWaitHandle waitHandle = null; bool succeeded = NativeMethods.DuplicateHandle( new HandleRef(this, NativeMethods.GetCurrentProcess()), processHandle, new HandleRef(this, NativeMethods.GetCurrentProcess()), out waitHandle, 0, false, NativeMethods.DUPLICATE_SAME_ACCESS); if (!succeeded) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } this.SafeWaitHandle = waitHandle; }4.StartInfo屬性:獲取或設置要傳遞給 Process 的 Start 方法的屬性。StartInfo 表示用于啟動進程的一組參數。 調用 Start 時,StartInfo 用于指定要啟動的進程。 唯一必須設置的 StartInfo 成員是 FileName 屬性。
具體介紹一下該方法的實現代碼:
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), MonitoringDescription(SR.ProcessStartInfo)] public ProcessStartInfo StartInfo { get { if (startInfo == null) { startInfo = new ProcessStartInfo(this); } return startInfo; } [ResourceExposure(ResourceScope.Machine)] set { if (value == null) { throw new ArgumentNullException("value"); } startInfo = value; } }5.CreateNoWindow屬性:獲取或設置指示是否在新窗口中啟動該進程的值。
具體介紹一下該方法的實現代碼:
[ DefaultValue(false), MonitoringDescription(SR.ProcessCreateNoWindow), NotifyParentProperty(true) ] public bool CreateNoWindow { get { return createNoWindow; } set { createNoWindow = value; } }以上簡單介紹了該類的三種常用方法和兩種常用屬性,在實際的開發項目中無須對每個屬性方法和屬性的底層實現做全面的了解,但建議在學習該類的時候,適當的了解一下某一些類的方法實現,有助于我們很好的掌握該類。
二.如何實現PDF文件轉化為SWF文件
在項目如果需要將PDF文件轉換為SWF文件,可以在項目中引入Swftools插件,該插件的主要功能:PDF到SWF轉換器。 每頁生成一幀。 使您能夠在Flash Movie中擁有完全格式化的文本,包括表格,公式,圖形等。 它基于Derek B. Noonburg的xpdf PDF解析器。
簡單介紹一下該插件的常用參數:
-h , 主站蜘蛛池模板: 池州市| 随州市| 双牌县| 邓州市| 新丰县| 上思县| 青川县| 巨野县| 崇州市| 皋兰县| 塔河县| 沙河市| 临高县| 松潘县| 武定县| 永顺县| 佛山市| 安平县| 祁门县| 苏尼特左旗| 原阳县| 清原| 吉木乃县| 同江市| 恩施市| 梁河县| 和静县| 石家庄市| 大余县| 阿坝县| 山西省| 达尔| 怀集县| 江西省| 浠水县| 鸡东县| 绵阳市| 荃湾区| 静安区| 孟州市| 鄂州市|