69,371
社区成员
发帖
与我相关
我的任务
分享
厉害,还有这种操作。ReadProcessMemory/WriteProcessMemory是C、C++都有吗? 还是只是C++ 你可以读到指针的值,但不同程序中这个值是指向各自程序自身的虚拟内存中,当然后你可以用ReadProcessMemory/WriteProcessMemory读写其他进程的内存
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!//test.c 本程序演示两个进程之间通过临时文本文件交换数据实现间接调用 //A将请求数据写到文件a.txt,写完后改名为aa.txt //B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt //A发现bb.txt存在时,读取其内容,读完后删除bb.txt #include <io.h> #include <stdio.h> #include <windows.h> int main(int argc,char **argv) { int d,r; FILE *f; char cmdstr[512]; if (argc<2) { sprintf(cmdstr,"cmd /c \"%s\" B",argv[0]); WinExec(cmdstr,SW_HIDE); for (d=1;d<=5;d++) {//共使用1..5调用B 5次 //A将请求数据写到文件a.txt,写完后改名为aa.txt f=fopen("a.txt","w"); fprintf(f,"%d\n",d); fclose(f); rename("a.txt","aa.txt"); printf("call with %d\n",d); //A发现bb.txt存在时,读取其内容,读完后删除bb.txt while (1) { Sleep(100); if (_access("bb.txt",0)!=-1) { f=fopen("bb.txt","r"); fscanf(f,"%d",&r); fclose(f); remove("bb.txt"); break; } } printf("result:%d\n",r); } return 0; } if (argv[1][0]=='a'||argv[1][0]=='A') {//A for (d=1;d<=5;d++) {//共使用1..5调用B 5次 //A将请求数据写到文件a.txt,写完后改名为aa.txt f=fopen("a.txt","w"); fprintf(f,"%d\n",d); fclose(f); rename("a.txt","aa.txt"); printf("call with %d\n",d); //A发现bb.txt存在时,读取其内容,读完后删除bb.txt while (1) { Sleep(100); if (_access("bb.txt",0)!=-1) { f=fopen("bb.txt","r"); fscanf(f,"%d",&r); fclose(f); remove("bb.txt"); break; } } printf("result:%d\n",r); } } else {//B while (1) { //B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt while (1) { Sleep(100); if (_access("aa.txt",0)!=-1) { f=fopen("aa.txt","r"); fscanf(f,"%d",&r); fclose(f); r=r*10; f=fopen("b.txt","w"); fprintf(f,"%d\n",r); fclose(f); remove("aa.txt"); rename("b.txt","bb.txt"); break; } } if (r==50) break; } } return 0; } //C:\tmp\test>test //call with 1 //result:10 //call with 2 //result:20 //call with 3 //result:30 //call with 4 //result:40 //call with 5 //result:50 // //C:\tmp\test>start /B test B // //C:\tmp\test>test A //call with 1 //result:10 //call with 2 //result:20 //call with 3 //result:30 //call with 4 //result:40 //call with 5 //result:50 // //C:\tmp\test>
//test.c 本程序演示两个进程之间通过临时文本文件交换数据实现间接调用
//A将请求数据写到文件a.txt,写完后改名为aa.txt
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
#include <io.h>
#include <stdio.h>
#include <windows.h>
int main(int argc,char **argv) {
int d,r;
FILE *f;
char cmdstr[512];
if (argc<2) {
sprintf(cmdstr,"cmd /c \"%s\" B",argv[0]);
WinExec(cmdstr,SW_HIDE);
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
return 0;
}
if (argv[1][0]=='a'||argv[1][0]=='A') {//A
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
} else {//B
while (1) {
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
while (1) {
Sleep(100);
if (_access("aa.txt",0)!=-1) {
f=fopen("aa.txt","r");
fscanf(f,"%d",&r);
fclose(f);
r=r*10;
f=fopen("b.txt","w");
fprintf(f,"%d\n",r);
fclose(f);
remove("aa.txt");
rename("b.txt","bb.txt");
break;
}
}
if (r==50) break;
}
}
return 0;
}
//C:\tmp\test>test
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>start /B test B
//
//C:\tmp\test>test A
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>