• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#的Process类调用第三方插件实现PDF文件转SWF文件

C#的Process类调用第三方插件实现PDF文件转SWF文件

作者:彭泽0902 字体:[增加 减小] 来源:互联网 时间:2017-05-28

彭泽0902 通过本文主要向大家介绍了c#process类,c#中process,c#process,c#process.start,java process类等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在项目开发过程中,有时会需要用到调用第三方程序实现本系统的某一些功能,例如本文中需要使用到的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); 
      }
    }

</div>

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);
      } 
    }
</div>
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;
      }
 
    }

</div>

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; 
    }
</div>
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()); 
      } 





 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#的Process类调用第三方插件实现PDF文件转SWF文件
  • C#使用Process类调用外部程序分解
  • c#使用process.start启动程序报错解决方法
  • 浅谈C#中Process类的使用详解
  • 解析C#中用Process类杀死进程,执行命令的深入分析

相关文章

  • 2017-05-28C#中判断字符串是全角还是半角的实现代码
  • 2017-05-28C#写入对象或集合类型数据到xml文件的方法
  • 2017-05-28WinForm窗体调用WCF服务窗体卡死问题
  • 2017-05-28C#编程实现连接SQL SERVER数据库实例详解
  • 2017-05-28C# 系统热键注册实现代码
  • 2017-05-28详解C#获取特定进程CPU和内存使用率
  • 2017-05-28C#检测是否有u盘插入的方法
  • 2017-05-28c# 删除所有的空文件夹的小例子
  • 2017-05-28C#线程 BeginInvoke和EndInvoke使用方法
  • 2017-05-28泛型编程去掉字段重复数据的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现图片上传(PC端和APP)保存及 跨域上传说明
    • 深入线程安全容器的实现方法
    • C# List 排序各种用法与比较
    • C#中委托的+=和-=深入研究
    • C#多线程之Thread中Thread.IsAlive属性用法分析
    • C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)
    • C# Struct的内存布局问题解答
    • C#条码生成及打印实例代码
    • C#百万数据查询出现超时问题的解决方法
    • 详解C#读取Appconfig中自定义的节点

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有