测试环境:Delphi7 + Win7

发起端

unit uRequest;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TfrmRequest = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
frmRequest: TfrmRequest; implementation uses
ShellAPI, superobject, EncdDecd; {$R *.dfm} //推荐此种方式
procedure TfrmRequest.Button1Click(Sender: TObject);
var
sExeName, sParams: string;
soParams: ISuperObject;
begin
//待执行的应用程序路径,可以是绝对路径,也可以是相对路径。
//当然目录地址可以通过ShellExecute的第五个参数设置,如果不设置,默认的就是当前目录。
sExeName := 'Response.exe';
//标准的传参是允许通过空格的方式传入多个参数的,
//但是有可能某个参数值中就有空格,所以这里采用JSON的方式,转义之后再接收
soParams := SO();
soParams.S['name'] := '张三';
soParams.I['age'] := ;
soParams.S['url'] := 'https://www.baidu.com/'; sParams := UTF8Encode(AnsiToUtf8(soParams.AsJSon()));
ShellExecute(, 'open', PChar(sExeName), PChar(sParams), nil, SW_SHOWNORMAL);
end; //不建议此种方式
procedure TfrmRequest.Button2Click(Sender: TObject);
var
sExeName, sParams: string;
begin
sExeName := 'Response.exe';
//传参是允许通过空格的方式传入多个参数的
sParams := '张三 20 www.baid.com';
ShellExecute(, 'open', PChar(sExeName), PChar(sParams), nil, SW_SHOWNORMAL);
end; end.

接收端(即被打开的应用程序)

unit uResponse;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TfrmResponse = class(TForm)
btnResponse: TButton;
Memo1: TMemo;
procedure btnResponseClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
function ReponseParam: Boolean;
public
{ Public declarations }
end; var
frmResponse: TfrmResponse; implementation uses
superobject, EncdDecd; {$R *.dfm} procedure TfrmResponse.btnResponseClick(Sender: TObject);
var
i: Integer;
s: string;
begin
for i := to ParamCount do
begin
s := ParamStr(i);
ShowMessage(s);
end;
end; function TfrmResponse.ReponseParam: Boolean;
var
sResponse: string;
soParams: ISuperObject;
begin
Result := False;
//接受传参
if ParamCount = then Exit;
//注意,传参的下标是从1开始
case ParamCount of
:
begin
sResponse := ParamStr();
sResponse := UTF8Decode(sResponse);
soParams := SO(sResponse);
Memo1.Lines.Add('姓名:' + soParams.S['name']);
Memo1.Lines.Add('年龄:' + IntToStr(soParams.I['age']));
Memo1.Lines.Add('博客地址:' + soParams.S['url']);
end;
:
begin
Memo1.Lines.Add('姓名:' + ParamStr());
Memo1.Lines.Add('年龄:' + ParamStr());
Memo1.Lines.Add('博客地址:' + ParamStr());
end;
else
Exit;
end; Result := True;
end; procedure TfrmResponse.FormCreate(Sender: TObject);
begin
if not ReponseParam then
close;
end; end.

Delphi---ShellExecute跨进程调用exe的更多相关文章

  1. Android中的跨进程调用技术AIDL

    什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用 ...

  2. Android四大组件应用系列5——使用AIDL实现跨进程调用Service

    一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentPr ...

  3. Android菜鸟的成长笔记(21)——跨进程调用Service

    我们都知道在Android中的每一个应用是一个进程,其实每一个应用就相当于Linux系统里面的一个用户,进程和进程之间的通信其实就相当于用户和用户之间的通信,为了实现这种跨进程通信,Android提供 ...

  4. 跨进程调用Service(AIDL Service)

    1.什么是aidl:aidl这是 Android Interface definition language的缩写,一看就明确.它是一种android内部进程通信接口的描写叙述语言.通过它我们能够定义 ...

  5. c# 进程调用exe

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostic ...

  6. Android 跨进程调用忽略权限

    Framework层: @Override    public StackInfo getStackInfo(int stackId) {        final int callingUid = ...

  7. umeng社交分享最新版5.0的跨进程使用崩溃的问题及解法-Android

    先简单介绍下5.0版的变化.5.0最大的特色是调用简单,采用了链式语法,形如: new ShareAction(context).setPlatform(share_media) .withText( ...

  8. Android跨进程通信的四种方式

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

  9. Android 跨进程数据共享

    Android 开发过程中,基于功能隔离.进程安全.进程保活等等考虑,我们经常需要为应用划分进程,然后不得不面临跨进程通信和跨进程共享数据的挑战. 跨进程通信 相对来说,跨进程通信比较简单,常用的方式 ...

随机推荐

  1. 微信小程序---绘图

    传送门: https://mp.weixin.qq.com/debug/wxadoc/dev/api/canvas/reference.html

  2. WebSocket-Node

    WebSocket Client & Server Implementation for Node 参考资料:[https://github.com/theturtle32/WebSocket ...

  3. python文档的数据读取,把读取数据写入到新的表里

    目的:接口自动化过程需要从表格文件读取,然后把结果写到表格中.没有多余内容全部是精华! 读取文件1 读取文件2 代码如下图: # -*-coding:utf-8 -*-# Author:wangjun ...

  4. eureka配置参数

    org.springframework.cloud.netflix.eureka.EurekaClientConfigBean 参数名称 说明 默认值 eureka.client.enabled 用于 ...

  5. 【Qt开发】QTableWidget设置根据内容调整列宽和行高

    QTableWidget要调整表格行宽主要涉及以下一个函数 1.resizeColumnsToContents();                      根据内容调整列宽            ...

  6. 【VS开发】使用MFC创建并调用ActiveX控件

    使用MFC创建并调用ActiveX控件 今天做了一下ActiveX的使用测试,总结一下: 首先使用MFC创建一个activeX的控件譬如ActiveXTest,编译成ocx并注册,然后另外编写一个测试 ...

  7. Confluence6.9配置邮件服务器

    一.调整confluence服务 1.在confluence安装目录下的server.xml中加一段邮件服务器的配置,加在confluence的Context中 <Context path=&q ...

  8. LPVOID 指针 转 int

    1 DWORD  WINAPI  SockUDP::RecvThread(LPVOID lparam){   //套接字  正确:int sock= *(int*)(lparam);   错误:int ...

  9. HDU 1042 N!(高精度阶乘、大数乘法)

    N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submi ...

  10. 【Linux 网络编程】网络IP地址结构体

    (1)IPv4套接口地址结构通常也称为"网际套接字地址结构",它以"sockaddr_in"命名,        定义在<netinet/in.h> ...