Wince程序间通讯

exe程序之间传递参数(wince) 独立exe程序之间传值的方法传递com口 传递参数 调用的方法(Wince程序) 立即下载

最近在做文件关联,有一个问题可能比较棘手,就是选中多个文件打开的时候,Windows在关联的时候不是把这个所有的文件的路径传作为参数传给一个程序,而是每个路径关联一个程序,也就是会打开N个程序。显然,这个有些不是我们需要的。例如Mp3播放器,应该是选中N个音频文件后,只打开一个文件,并且这N个文件会建立成一个播放列表。

那么简单的记录下,我们这里碰见的问题:

1 程序只能被打开一次,或者说只会有一个有效的程序在运行。这里,我们可以利用CreateMutex来实现互斥,利用GetLastError来判断是否存在。

2 接受参数:这个参数在Main函数的参数里面。很好理解。

3:选中N个文件只打开一个程序:这个肯定是利用到程序之间的通讯,当然肯定还有其他的办法,只是我不知道而已。这里我们就用WM_COPYDATA这个消息来实现。在c#中,我们实现两个函数,贴出代码,这样就会简化我们的程序:

 

 

 

        public struct COPYDATASTRUCT
        {
            /// <summary>
            /// 用户自定义数据
            /// </summary>
            public int dwData;

            /// <summary>
            /// 数据长度
            /// </summary>
            public int cbData;

            /// <summary>
            /// 数据地址指针
            /// </summary>
            public IntPtr lpData;

        }


        [DllImport("Coredll.dll", EntryPoint = "SendMessage", SetLastError = true)]
        public static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);


        public static void ReceivCopyData(ref Message m, out int dwData, out byte[] lpdata)
        {
            Console.WriteLine("ReceivCopyData********");
                      
            COPYDATASTRUCT cds = new COPYDATASTRUCT();

            cds = (COPYDATASTRUCT)(Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT)));
           
            dwData = cds.dwData;
            int len = cds.cbData;

            lpdata = new byte[len];

            Marshal.Copy(cds.lpData, lpdata, 0, len);

            m.Result = (IntPtr)0;
                         
           
        }
       
        public static int SendCopyData(IntPtr hWnd, int dwData, byte [] lpdata)
        {
            #region        
   
            Console.WriteLine("SendCopyData ********");
           

            COPYDATASTRUCT cds = new COPYDATASTRUCT();

            cds.dwData = dwData;

            cds.cbData = lpdata.Length;

            cds.lpData = Marshal.AllocHGlobal(lpdata.Length);

            Marshal.Copy(lpdata, 0, cds.lpData, lpdata.Length);

            IntPtr lParam = Marshal.AllocHGlobal(Marshal.SizeOf(cds));

            Marshal.StructureToPtr(cds, lParam, false);

            int result = 0;

            try
            {
                result = RockApi.SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, lParam);
            }

            finally
            {
                Marshal.FreeHGlobal(cds.lpData);

               //   Marshal.DestroyStructure(lParam, typeof(COPYDATASTRUCT));

                Marshal.FreeHGlobal(lParam);

            }

            return result;


            #endregion
      
        }

 

关于string 和byte[]之间的转换,可以有很多的方法,最好用的就是:

 

 

 

string --->>> byte []

 byte[] lpdata = System.Text.Encoding.Default.GetBytes(args[0]);

 

 

byte [] --->>>  string

string str = System.Text.Encoding.Default.GetString(lpData, 0, lpData.Length);

 

希望我说的清楚。

 

这里有一个比较棘手的问题就是WindowCE 下的C# (compact net ) Form本身没有消息机制,我们只能利用MessageWindow来实现,这样我们有碰见一个问题,就是我们在发送WM_COPYDATA消息的时候只能使用SendMessage,而不能是PostMessage.

这个如果多个程序之间没有协调好,就会容易有问题,所以我们可以利用COPYDATASTRUCT 这个结构体重的dwData来判断。你发的值,你肯定也是知道的撒。

 

还有一个问题就是我们在实际用的时候发现基本上我们选中N(N>1)个的时候,只能打开N-1个,配置打印信息,我们可以发现这个是因为第二个打开的时候其实第一个的消息接受还没有好。所以第二个里面我们采用延时一下Sleep,这样就可以的了。

 

代码就是主要的上面,写的一个例子,也是贴在下面:就是最基本的代码:

 int handle= RockApi.CreateMutex(IntPtr.Zero, true, "MP3Player");

            if (RockApi.GetLastError() == RockApi.ERROR_ALREADY_EXISTS)//当前有进程
            {
                Console.WriteLine(" ERROR_ALREADY_EXISTS ");
                System.Threading.Thread.Sleep(100);
                if (args.Length != 0)
                {
                    Console.WriteLine("Main Send CopyData _____");

                    byte[] lpdata = System.Text.Encoding.Default.GetBytes(args[0]);                   
                    RockApi.SendCopyData(new IntPtr(0xFFFF), 0, lpdata);

                    return;
                                     
                }

                return;

            }
            else
            {
                Console.WriteLine("CreateMutex First ");

                Form1 form = new Form1();

                if (args.Length != 0)
                form.filepath = args[0];

                Application.Run(form);

                RockApi.CloseHandle(handle);
                               
            }

 

 

完毕:

  Rocky

从零到一:Bioconductor新手入门与R包安装实战 本文详细介绍了Bioconductor在生物信息学中的重要性及其R包安装实战指南。从环境准备到BiocManager的使用,再到常见问题排查,帮助新手快速掌握这一强大工具。特别推荐org.Hs.eg.db等核心工具包,助力基因注释和功能分析,提升研究效率。 阅读详情

相关推荐

python数据分析与可视化

Python数据分析主要包括数据清洗、数据探索和数据可视化三个部分。数据清洗是数据分析的重要环节,主要是对数据进行预处理,包括缺失值处理、异常值处理、数据类型转换等。数据探索则是通过对数据进行初步分析,了解数据的分布和特征,为后续的数据分析提供基础。数据可视化则是将数据以图形化的方式呈现,帮助人们更好地理解和分析数据。

2301_82032652的博客 7715

wince c# Dll与应用程序之间通信 返回Dll运行的状态

wince c# :Dll与应用程序之间可以通信,返回Dll内运行的状态string strStatus。有什么好的办法,简单、稳定?

lzwxyz的专栏 837

经纬度转换为UTM坐标

UTM(通用横向墨卡托投影): 是一种以米为单位的坐标系统,用于地图和GPS导航。将地球划分为60个纵向的区域。每个区域宽6度,从赤道开始往南北两级方向划分。每个区域都有一个特定的字母。

weixin_45626706的博客 7278

Windows CE,Windows Mobile在PC端的操作.

上一段做WindowsCE上的工作.翻译,包装了微软的RAPI和dccManSink等.可以感知嵌入社设备的插拔.可以操作嵌入式设备上的注册表.文件,数据库等等.发出来算是给Delphi社区做个贡献 下面贴出的是三个单元的代码.也可以在优快云下载.里面包含例子.http://download.youkuaiyun.com/source/1993722  {**********

wr960204(武稀松)的专栏 4169

从‘平行’到‘鱼骨’:手把手拆解AlGaN/GaN HEMT多栅指结构的布局优化实战

本文深入探讨了AlGaN/GaN HEMT多栅指结构的布局优化,从传统的平行栅结构到创新的鱼骨栅结构,详细解析了如何通过优化信号路径和热管理提升功率器件的性能。文章结合实测数据和EDA工具,展示了鱼骨栅结构在相位一致性、热阻和版图利用率方面的显著改进,为射频功率放大器设计提供了实用指导。

weixin_27061475的博客 442

MT9V034摄像头学习笔记(一)_mt9v034摄像头循迹代码(1)

函数名称:uint8_t SCB_RegRead(uint8_t Device,uint8_t Address,uint16_t *Data)* 函数名称:uint8_t SCB_RegWrite(uint8 Device,uint8 Address,uint16 Data)* 函数名称:uint8 SCCB_SendByte(uint8 Data)* 函数名称:uint8 SCCB_ReadByte(void)* 修改时间:2018年3月4日。* 修改时间:2018年3月4日。

2401_87555661的博客 908

WINCE应用程序和驱动间通信

 WinCE上驱动程序的模型相对比较简单,实现一个驱动程序不是什么难事。尽管如此,本文还是实现了一个比较通用一点的通讯接口。应用程序发给信息驱动程序有两种方式,同步调用和异步调用。同步调用能够让驱动程序立即处理应用程序的请求,并返回驱动程序处理后的结果。如:#define MSG_TYPE_TEST_1            0x00000000#define MSG_TYPE_ICMP_

alien75的专栏 2444

AD22里面封装修改后,同步到PCB图里面

【摘要】本文介绍了Altium Designer 22中同步更新元件封装的三种方法:1)从PCB库直接更新:在PCB库面板右键选择"Update PCB With[封装名]";2)通过原理图标准更新:使用Design->Update PCB Document菜单;3)在PCB编辑器中验证更新:通过Tools->Update From PCB Libraries菜单。所有方法最终都需通过ECO(工程变更订单)确认变更,建议执行前仔细核对变更内容。这些方法适用于AD22及早期版本

whm128的博客 1763

WINCE程序设计之串口通信

如果说有一个WINCE不节约的Win32 API区域,那就是通信。因为运行WINCE的设备大部分是移动的 需要扩展的通信功能。 1.背景:WINCE将设备驱动程序分为两个主要的组:本地设备驱动程序和流设备驱动程序本地设备驱动程序 也称为“内置驱动程序” 这些设备驱动是一些硬件锁必须的 并且是在Windows CE硬件被设计好之后由原始设备制造商(OEM)创建的。这些驱动往往在设

bitwjg的专栏 807

Transformer从菜鸟到新手(一)

从本文开始回顾一下Transformer的原理与实现细节,包括分词算法BPE的实现。最终利用从零实现的Transformer模型进行英中翻译。

日积月累,天道酬勤 2125

FPGA经验谈系列文章——3、逻辑级数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xilinx FPGA开发tips系列——前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的

gzy0506的博客 1万+

WinCE驱动开发问题精华集锦(三)

转自:http://hgh123.blog.163.com/blog/static/5980422120086183235756/感谢 修改了WINCE自带的驱动程序后如何编译?如果是自己开发的驱动程序如何编译? 1、分为IDE方式和命令行方式。 IDE 方式的编译很简单,以PB5.0为例,打开定制内核的工程,在左边的“workspace”—“FileView”中找到你已经修...

weixin_30405421的博客 85

Vulkan入门系列3 - 绘制三角形代码解析(全)

【代码】Vulkan入门系列3 - 绘制三角形完整代码(带详细注释)

GPU全栈博主 1034

WinCE数据通讯之Web Service篇

Web Service用于PC间通讯的文章网上有很多,但用于WinCE平台调用的经验总结并不多见。Web Service的程序编写与配置调用相对来讲比较简单,Visual Studio里直接新建一个“Asp.net web 服务应用程序”就可以创建一个web Service项目了。其中的代码根据实际需求编写就行,这方面就不详述了。       终端设备是通过GPRS来进行数据传输的,因此,数据流

大新软件老杨 792

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[转载]WinCE数据通讯之Web Service篇

准备写个WinCE平台与数据库服务器数据通讯交互方面的专题文章,今天先整理个Web Service通讯方式。    公司目前的硬件产品平台是WinCE5.0,数据通讯是连接服务器与终端的桥梁,关系着终端的数据能否准确及时高效抵达服务器,是整个项目成败的关键。原先公司有同事用VC写过一个程序用Socket进行数据通讯,但一直问题不断。年前我开始探索用SqlCE与SqlServer数据同步方式进行数据

LIVE FOR LETTERS 768

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WinCE 编程实验(第十五章 Windows CE侦错环境)

  第十五章  Windows CE侦错环境 Windows CE提供了强大的原始码的侦错工具,它被整合在从系统开发到应用软件开发的多个工具中。Windows CE将侦错分为多个级别:在目标程序与Windows CE原始程序代码中内嵌的侦错用程序代码;用Emulator支持软件仿真方式的主机-目标装置的联机侦错;真实目标硬件上的主机-目标装置联机侦错等。 本章主要从使用者的

Welcome to Mike's Blog 1376

Web Service通讯方式

http://www.cnblogs.com/gbmf/archive/2009/05/22/1459914.html      准备写个WinCE平台与数据库服务器数据通讯交互方面的专题文章,今天先整理个Web Service通讯方式。      公司目前的硬件产品平台是WinCE5.0,数据通讯是连接服务器与终端的桥梁,关系着终端的数据能否准确及时高效抵达服务器,是整个项目成败的关

tcchriszhao的专栏 900

基本概念学习(1003)---嵌入式系统

嵌入式系统(Embedded system),是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,根据英国电气工程师协会( U.K. Institution of Electrical Engineer)的定义,嵌入式系统为控制、监视或辅助设备、机器或用于工厂运作的设备。与个人计算机这样的通用计算机系统不同,嵌入式系统通常执行的是带有特定要求的预先定义的任务。由...

weixin_33991727的博客 1460

LINUX学习之一:

学好linux的基础:C语言(GNU C语言与GCC);硬件基础;熟悉操作系统内核代码,熟悉多线程和网络知识。分驱动开发(驱动程序模型即框架)和应用程序开发,目标是驱动开发 驱动开发特点: 不能使用标准C库(5M太大不适合嵌入式设备(1MB)); 不像应用程序有操作系统守护,内核驱动程序出错不好排查。 应用程序可以动态申请和释放较大内存,而内核常驻内存固定(32位的8KB;64位的16KB...

weixin_30919571的博客 96

(转)嵌入式系统-历史

虽然嵌入式系统是近几年才风靡起来的,但是这个概念并非新近才出现。从20世纪七十年代单片机的出现到今天各式各样的嵌入式微处理器,微控制器的大规模应用,嵌入式系统已经有了近30年的发展历史。   作为一个系统,往往是在硬件和软件交替发展的双螺旋的支撑下逐渐趋于稳定和成熟,嵌入式系统也不例外。   嵌入式系统的出现最初是基于单片机的。70年代单片机的出现,使得汽车、家电、工业机器、通

心静如水 906

单片机与嵌入式系统的区别 单片机和嵌入式linux区别

在如今高速发展的社会下,电子信息技术的更新迭代相当迅速,想要不被社会淘汰,就要不断更新自己的技术水平。本文简单分析了单片机与嵌入式系统的联系、组成结构对比等基础知识,并列举了几种适用于PIC18F系列单片机的几种嵌入式技术实时操作系统。    单片机与嵌入式系统的区别 单片机和嵌入式linux区别   (1)单片机基本结构   单片机由运算器、...

weixin_34227447的博客 583

常用嵌入式操作系统

嵌入式操作系统与通用的操作相比较主要特点在于:1.小内核,稳定可靠。2.需要可装卸、可裁剪,以便能灵活应对各种不同的硬件平台。3.面向应用,强实时性,可用于各种设备控制当中。国际上常见的嵌入式操作系统大约有40种左,右如:Linux、uClinux、WinCE、PalmOS、Symbian、eCos、uCOS-II、VxWorks、pSOS、Nucleus、ThreadX 、...

weixin_34249367的博客 236

wince6 两个应用程序进程间通信 OnCopyData(改进)

由于字符集的关系,如果系统是使用unicode字符集可能转换有问题,所以造成之前文章的发送数据时候只能发送第一个,后面的转换不了,现在使用char *来发送就没有问题了。 发送端 char* CStringToCharArray(CString str) { char *ptr; #ifdef _UNICODE LONG len; len = WideCharToMultiB

heiyuu1的专栏 专注嵌入式系统的学习 1382
上一篇: 只允许运行一个实例的程序(互斥程序)
下一篇: 动态链接库dll,静态链接库lib, 导入库lib
dadahacker
博客等级 码龄20年 78粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值