精华内容
下载资源
问答
  • 不同进程 的不同变量 可以同时访问相同的地址且互不影响吗 或者两个进程 的不同变量使用一个地址,可以吗 会出现问题吗
  • 这里记录一下使用Win32 API在同一台机器上进行同进程通信、不同进程通信。 使用的API [DllImport("User32.dll", EntryPoint = "FindWindow")] public static extern IntPtr FindWindow(string lpClassName, string ...

    这里记录一下使用Win32 API在同一台机器上进行同进程通信、不同进程通信。

    使用的API
    [DllImport("User32.dll", EntryPoint = "FindWindow")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
    [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
    
    /// <summary>
    /// 消息发送API
    /// </summary>
    /// <param name="hWnd">指定要接收消息的窗口的句柄</param>
    /// <param name="Msg">指定被发送的消息ID</param>
    /// <param name="wParam">指定附加的消息特定信息</param>
    /// <param name="lParam">指定附加的消息特定信息</param>
    /// <returns>返回值指定消息处理的结果,依赖于所发送的消息</returns>
    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
    
    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref string lParam);
    
    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    public static extern int SendMessage(IntPtr win, int WM_COPYDATA, IntPtr wParam, ref COPYDATASTRUCT cds);
    /// <summary>
    /// 异步消息发送API
    /// </summary>
    /// <param name="hWnd">指定要接收消息的窗口的句柄</param>
    /// <param name="Msg">指定被发送的消息ID</param>
    /// <param name="wParam">指定附加的消息特定信息</param>
    /// <param name="lParam">指定附加的消息特定信息</param>
    /// <returns></returns>
    [DllImport("User32.dll", EntryPoint = "PostMessage")]
    public static extern int PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
    
     [DllImport("User32.dll", EntryPoint = "SendMessage")]
     public static extern int PostMessage(IntPtr win, int WM_COPYDATA, IntPtr wParam, ref COPYDATASTRUCT cds);
    
     [DllImport("User32.dll", EntryPoint = "SendMessage")]
     public static extern int PostMessage(IntPtr win, int WM_COPYDATA, IntPtr wParam, ref string str);
    
     /// <summary>
    /// 接收信息
    /// </summary>
    /// <param name="hwnd">带文本的窗口或控件的句柄</param>
    /// <param name="buf">指向接收文本的缓冲区的指针</param>
    /// <param name="nMaxCount">指定要保存在缓冲区内的字符的最大个数,其中包含NULL字符。如果文本超过界限,它就被截断</param>
    /// <returns></returns>
    [DllImport("User32.Dll")]
    public static extern int GetWindowText(int hwnd, StringBuilder buf, int nMaxCount);
    
    找到本机要接收的窗体
    // 不能再加上类名限定,否则会找不到
    IntPtr win = Win32API.FindWindow(null,"窗体标题");
    
    1. 同一进程

    这比较简单。

    • 数字:直接调用SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam),在“protected override void DefWndProc(ref Message m)”接收的时候取Message.LParam、Message.WParam,因为数字与IntPtr之间可以强转。
    • 字符串:注意类型的转换
    // 发
    Win32API.PostMessage(win,0x890,IntPtr.Zero,Marshal.StringToHGlobalAnsi(str));
    
    // 收
    string str = Marshal.PtrToStringAnsi(m.LParam);
    
    2. 不同进程
    • 数字:与上面一致。
    • 字符串:比较麻烦
      • 方法1
        自定义结构体,注意该方法必须使用WM_COPYDATA 参数,就是说不能自定义消息号了。可能会觉得这里使用结构体多此一举,之所以不直接使用string,是因为在使用同样的方式接收数据的时候,会报错“string没有提供无参的构造函数”,struct有默认的无参构造函数。 这个方法的问题在于:如果是跟第三方的API在进行通信的时候,你不能要求别人也必须按照你的struct来传参,所以只有在接收、发送都是自己的程序的时候,以及在协同开发有约定类型、第三方有指定类型的时候,才适用。
      public struct COPYDATASTRUCT
       {
           public IntPtr dwData;
           public int cbData;
           [MarshalAs(UnmanagedType.LPStr)]
           public string lpData;
       }
      
       const int WM_COPYDATA = 0x004A;
       // 发
       string str = "test";
       byte[] sarr = System.Text.Encoding.Default.GetBytes(str);
       int len = sarr.Length;
       COPYDATASTRUCT cds;
       cds.dwData = (IntPtr)Convert.ToInt16(123);//可以是任意值
       cds.cbData = len + 1;//指定lpData内存区域的字节数
       cds.lpData = str;//发送给目标窗口所在进程的数据
       Win32API.PostMessage(win, WM_COPYDATA, IntPtr.Zero, ref cds);
       // 收
        protected override void DefWndProc(ref Message m)
        {
           switch (m.Msg)
           {
               case WM_COPYDATA:
                   COPYDATASTRUCT cds = new COPYDATASTRUCT();
                   Type t = cds.GetType();
                   cds = (COPYDATASTRUCT)m.GetLParam(t);
                   string strResult = cds.dwData.ToString() + ":" + cds.lpData;
                   MessageBox.Show(strResult);
                   break;
               default:
                   base.DefWndProc(ref m);
                   break;
           }
       }
      
      • 方法2
        传递控件句柄,通过GetWindowText来接数据。这里不需要再封装struct,可以自定义消息号,但需要有控件的Handle来作为参数,而且只能传递字符串。
      // 发送:0x890是自定义的消息号,btn_Send是界面的一个控件,这会将该控件的Text值发送出去
      Win32API.PostMessage(win, 0x890, this.btn_Send.Handle, IntPtr.Zero);
      
      // 接收
      protected override void DefWndProc(ref Message m)
      {
         StringBuilder sb = new StringBuilder(1024 * 2);
         switch (m.Msg)
         {
             case 0x890:
                 Win32API.GetWindowText(m.WParam.ToInt32(), sb, sb.Capacity);
                 MessageBox.Show(sb.ToString());
                 break;
             default:
                 base.DefWndProc(ref m);
                 break;
          }
      }
      

    其实这些方法用起来都不太爽,因为简单来说我就是想一个进程给另一个进程发一条信息而已,不想使用Socket、WebService、WCF等,因为已经确定在同一台机器了。还有什么好办法吗???

    展开全文
  • C++之不同进程消息通信

    千次阅读 2017-08-27 11:24:27
    不同进程间消息传递可通过注册Windows消息和用户自定义消息实现: 一. 注册Windows消息方式  1、定义消息 const UINT WM_MESSAGE_PROCESS = ::RegisterWindowMessage(_T("Message_Process")); // 接收方 ...
         不同进程间消息传递可通过注册Windows消息和用户自定义消息实现:

          一. 注册Windows消息方式 

          1、定义消息
    const UINT WM_MESSAGE_PROCESS = ::RegisterWindowMessage(_T("Message_Process")); // 接收方

    const UINT WM_MESSAGE_PROCESS = ::RegisterWindowMessage(_T("Message_Process"));   // 发送方

          2、接收方消息映射
    afx_msg LRESULT OnProcessMsg(WPARAM wparam, LPARAM lparam);
    
    ON_REGISTERED_MESSAGE(WM_MESSAGE_PROCESS,OnProcessMsg)

           3、接收方消息处理
    LRESULT CSunjianDlgTestDlg::OnProcessMsg(WPARAM wparam, LPARAM lparam)
    {
    if( 1 == wparam )
    {
        CString strString = _T("接收到远程进程消息");
        MessageBox(strString);
    }
    
        return 0;
    }

           4、发送方消息发送
    HWND hWnd = NULL;
    hWnd = ::FindWindow(NULL,_T("SunjianDlgTest"));
    ::PostMessage(hWnd,WM_MESSAGE_PROCESS,1,2);

            不同进程间消息传递参数仅能传递简单参数,如整型数据等,诸如字符串、结构体复杂类型的数据,无法进行传递,因为两个进程使用不同的虚拟内存,所以数据无法传递,关于不同进程间数据传递问题,请参考转载的文章,大神给出详细解释http://blog.csdn.net/slj_win/article/details/40795159。


    二、 用户自定义消息方式 
          按照用户自定义消息流程,接收方和发送方采用相同的消息值。

    #define WM_USER_PROCESS WM_USER+1

          个人水平有限,不足之处请批评指正,欢迎交流。
    展开全文
  • 不同进程切换的时候,操作系统触发什么事件?怎么防止别的进程切换或者获得操作?
  • 不同进程同时调用同一个DLL

    千次阅读 2013-10-25 11:22:44
    不同进程之间共享DLL的只读数据段,可写的数据段每个进程有单独一份,不会相互冲突啊。
    不同进程之间共享DLL的只读数据段,可写的数据段每个进程有单独一份,不会相互冲突啊。
    
    展开全文
  • 关于如何让不同进程之间的窗体成为父子级关系 背景 我的公司在做项目的时候,通过进程打开的方式来其他公司平台的软件。由于我们的平台是主平台,而其他平台就被看做是逻辑上的子平台而被打开。所以需要其他平台所...

    关于如何让不同进程之间的窗体成为父子级关系


    背景

    我的公司在做项目的时候,通过进程打开的方式来其他公司平台的软件。由于我们的平台是主平台,而其他平台就被看做是逻辑上的子平台而被打开。所以需要其他平台所打开的窗体,隶属于我的平台软件窗体,即做为子窗体存在。

    大家都知道,在同一个项目(进程)中,可以通过form.Show(parentForm.Handle)或者通过form.ShowDialog(parentForm.Handle)来强制性的指定一个窗体为另一个窗体的子窗体。

    那么对于不同程序集之间(不同项目之间、不同进程之间)的程序,可不可以同样的确定两个窗体之间的父子级的关系?答案当然是肯定的。


    思路

    我们可以观察Show()和ShowDialg()的函数原型:

    1. public DialogResult ShowDialog(IWin32Window owner);
    2. public void Show(IWin32Window owner);

    他们的参数都是一个实现IWin32Window的对象

    我们再看IWin32Window接口

    //
    // 摘要:
    //     提供一个用于公开 Win32 HWND 句柄的接口。
    [ComVisible(true)]
    [Guid("458AB8A2-A1EA-4d7b-8EBE-DEE5D3D9442C")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IWin32Window
    {
        //
        // 摘要:
        //     获取由实施者表示的窗口句柄。
        //
        // 返回结果:
        //     由实施者表示的窗口句柄。
        IntPtr Handle { get; }
    }

    观察上面函数,发现只要在一个对象内部实现获取一个窗口句柄属性方法的对象都以做为传值。那么我们可以想到,我们只要通过一个对象,里面放入某一个进程窗体的句柄,让然后实现这个属性获取该进程窗体的句柄,是不是就可以将这个进程的窗体做为父窗体传入Show或者ShowDialog了。


    代码

    代码如下:

    
    public class FormHandle : IWin32Window
    {
        private IntPtr _handle = IntPtr.Zero;
        public FormHandle(int handleNum)
        {
            this._handle = new IntPtr(handleNum);
        }
        public IntPtr Handle
        {
            get
            {
                return this._handle;
            }
        }
    }

    上端条用,如已知另一个项目(进程)窗体的句柄的方法为GetOtherProcessWinForm,那么代码为:

    //ShowDialog
    SonFrm sonFrm = new SonFrm();
    sonFrm.ShowDialog(new FormHandle(GetOtherProcessWinForm()));
    //Show
    SonFrm sonFrm = new SonFrm();
    sonFrm.Show(new FormHandle(GetOtherProcessWinForm()));

     

    展开全文
  • android 不同进程间的调用 AIDL 实现通讯服务  最近对aidl android 不同进程间的调用,不同运用间的调用做了一些尝试: 步骤如下: 1:首先在要被调用的程序里写好服务service 具体代码如下: ...
  • 不同进程之间互斥锁的使用

    千次阅读 2013-11-12 17:11:08
    互斥锁位于共享内存区,将用于不同进程之间的上锁,设置互斥锁的属性为PTHREAD_PROCESS_SHARED,并初始化互斥锁。 void my_lock_init(char *pathname) { int fd; pthread_mutexattr_t mattr; fd=open("/dev/...
  • 所以此功能就类似点击桌面系统上的应用程序图标运行不同的程序。 初步思路是这样子的:再用一个独立的进程B,让B永远显示在界面中(只是一个小图标,类似搜狗输入法),然后通过 点击进程B来管理A1与A2的切换...
  • Ospf 不同进程下建邻居问题分析

    千次阅读 2009-07-30 02:53:29
    Ospf 不同进程下建邻居问题分析 众所周知,OSPF进程号仅在本地有效,即不同OSPF进程号只要公告了同一网段,就能建邻居,交换路由更新。我们要分析一下同一路由器下如果同时有2个不同的OSPF进程,是否都能与对方建...
  • 就是——不同进程直接的方法调用 CRM暴露了一个接口【地址】,我一访问可以生成一个xml,得到一个类。我生成类之后我可以调用它里面的方法。 左边里有一个代理对象,代理对象里面定义了一个 一调用代理对象,其实...
  • 前些天在 CSDN论坛上看到一个帖子,询问互斥锁 (pthread_mutex_t)是否可以用来同步不同进程的线程。 当时我的回答是不可以。 其实,更准确的答案是,不一定。 首先,互斥锁默认的情况下,只能用于进程内部的...
  • android不同进程之间的数据传递

    千次阅读 2016-07-07 10:18:35
    原理:在需要传递数据的2个进程中都写一个AIDL文件,自定义一个Binder继承自AIDL所创建的哪个Binder通过Binder把进程和Service绑定起来,来达到数据互传的目的。 注意: 1、两个进程创建的AIDL文件的文件名必须一致 ...
  • 不同进程间的共享问题

    千次阅读 2004-12-24 16:05:00
    不同进程间的共享问题一直是编程人员常常需要面对,但又不容易解决的问题。我在写程序的工程中也深受其害,从而想到将自己遇到的情况做一下总结,也就促成了这篇文章。文章中重点论述有关数据和内核句柄的共享问题。...
  • 不同进程之间共享内存

    千次阅读 2015-01-29 21:42:30
    3、将文件映射对象映射到进程的地址空间(MapViewOfFile) 至此,第三步返回的指针就是指向我们共享内存起始位置,使用方法如同其他指针一样。 而对应的,释放共享内存也有三个步骤: 清理也有三个步骤: ...
  • VC/MFC 不同进程间的消息通信与数据(字符串)发送 本文转自于 http://book.csdn.net/bookfiles/212/10021210209.shtml 出处:Windows应用程序捆绑核心编程 3.4 使用WM_COPYDATA消息通信 对于少量数据可以用WM_...
  • 不同进程拥有独立的进程空间,是不能共享各自的变量的,这就引申了一个问题,就是不同进程不能操作同一个链表,那如何解决这个问题呢,我们用到了共享内存。 共享内存是物理地址,可以映射给多个进程使用。
  • 使用不同进程打开不同的Excel文件

    千次阅读 2012-12-19 10:01:03
    缺省情况下,新打开的Excel文件会和已经打开的Excel文件共用一个窗口,这样很...如果想恢复使用一个进程打开所有的Excel文件,需要选中使用DDE复选框,然后DDE消息为  [open("%1")] ,然后保存相关的设置即可。
  • 第1步: 新建控制台工程,主进程代码如下#include "stdafx.h" #include "windows.h"int _tmain(int argc, _TCHAR* argv[]) { wchar_t MemShareName[] = L"MemShareForTest"; LPVOID pMemShare; int data = 10; //...
  • ospf不同进程下的邻居状态

    千次阅读 2017-08-31 14:10:57
    网络图如下:
  • 原文  ... socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX ...虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于
  • 相同程序不同进程下实现数据共享

    千次阅读 2017-06-03 21:43:23
    进程间共享的是相同的物理地址,不同进程对应相同物理地址的虚拟地址并不相同,进程间不能共享指针,因为指针指向的是虚拟地址对应的数据,在另一进程中该虚拟地址并不指向原来的物理地址,例如 #include ...
  • 一、函数功能 ...而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。 二、函数原型 SendMessage函数的原型为  LRESULT SendMessage(   HWND hWnd,   UINT Msg,   WPARAM wPar...
  • 不同进程之间的互斥锁的使用

    千次阅读 2013-01-21 23:40:01
    前段时间碰到个需求,关于Linux共享内存下的互斥锁的使用 我的设想是给读写进程共享的数据结构上添加上一个互斥锁 比如 typedef struct st_setting{ struct obsedata data;
  • 此前遇到一个问题,希望实现一个COM组件,能够被不同的AP调用,同时需要他们保持同步。比较好的方式是采用ATL实现singleton的Com组件,很遗憾,这部分并不熟悉,只是依照codeproject上的sample"葫芦"画了一个瓢。看...
  • 不同进程之间的线程互斥锁的使用

    千次阅读 2015-04-11 20:42:12
    // 初始化共享内存段,存放互斥锁,该锁用于不同进程之间的线程互斥。 pthread_mutexattr_t mutextattr; pthread_mutexattr_init(&mutextattr); // 设置互斥锁在进程之间共享 pthread_mutexattr_setpshared(&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,596
精华内容 22,238
关键字:

不同进程