我用c++写了一个控制台程序image.exe 用来输出一个txt文件
我又用vb写了一个程序 来调用控制台程序
我用了如下的几种语句
Shell "cmd.exe /c ""c:\image.exe"""
'retval = Shell("c:\image.exe")
'Shell ("command.com /c D:\C++工程\image\debug\image.exe"), vbHide运行时 控制台窗口一闪而过
但是没有输出txt文件
好像控制台程序没有运行完一样但是我双击这个image.exe就能正常输出txt 很奇怪
vb调用就输出不了txt 怪了
据说vb中运行控制台程序不能这么调用 是吗?
怎么才能在vb中调用控制台程序?(用createprocess调用程序也不能输出txt) 怎么回事?
我又用vb写了一个程序 来调用控制台程序
我用了如下的几种语句
Shell "cmd.exe /c ""c:\image.exe"""
'retval = Shell("c:\image.exe")
'Shell ("command.com /c D:\C++工程\image\debug\image.exe"), vbHide运行时 控制台窗口一闪而过
但是没有输出txt文件
好像控制台程序没有运行完一样但是我双击这个image.exe就能正常输出txt 很奇怪
vb调用就输出不了txt 怪了
据说vb中运行控制台程序不能这么调用 是吗?
怎么才能在vb中调用控制台程序?(用createprocess调用程序也不能输出txt) 怎么回事?
但是这上面所有的方法我都用了
都是不能正常输出txt
求助高手
不行吗?
retval = Shell("c:\image.exe",vbNormalFocus)
两种都不行
我试过了
没有产生txt文件
我写的这个image.exe 其实是一个子程序
是一个验证码识别程序 因为用c++写验证码识别比较好写
输出的验证码写在txt中
然后我用vb写程序读取txt 然后再进行自动填表
这样开发效率 省时省力然而在vb中调用这个控制台程序却遇到了前所未有的困难
真囧 谁能帮帮我
Shell "cmd.exe /k ""c:\image.exe""", vbNormalFocus
我弄成了一个dll
可是依然不行 创建不出文件
#include <iostream>
#include <fstream>
using namespace std;#define W 60 //定义验证码图片的宽度
#define H 20 //定义验证码图片的宽度
#define N 4 //定义字符位数,一般是4位
#define BMP_filename "c:\\2.bmp"
int x,y,i,s,temp;
int YZM[W][H]={0};
int YZM_red[W][H]={0};
int YZM_green[W][H]={0};
int YZM_blue[W][H]={0};
int rec[W]={0};
int lf[N],rt[N],up[N],dw[N];
char result[4];
int a=0;
int x1, y1, x2, y2, x3, y3, x4, y4;//四个数字起始点
int b=0;
int c=0;
int d=0;
char check(int x, int y)
{
if( YZM[x+1][y]!=0 && YZM[x+2][y]!=0 && YZM[x+3][y]==0 && YZM[x+4][y]==0 && YZM[x+5][y]==0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]!=0&&YZM[x+3][y+1]!=0&&YZM[x+4][y+1]!=0&&YZM[x+5][y+1]==0 &&
YZM[x][y+2]==0&&YZM[x+1][y+2]==0&&YZM[x+2][y+2]==0&&YZM[x+3][y+2]!=0&&YZM[x+4][y+2]!=0&&YZM[x+5][y+2]==0 &&
YZM[x][y+3]==0&&YZM[x+1][y+3]==0&&YZM[x+2][y+3]==0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]!=0&&YZM[x+5][y+3]!=0) return '0';
if( YZM[x+1][y]!=0&&YZM[x+2][y]!=0&&YZM[x+3][y]==0&&YZM[x+4][y]==0&&YZM[x+5][y]==0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]!=0&&YZM[x+3][y+1]==0&&YZM[x+4][y+1]==0&&YZM[x+5][y+1]==0 &&
YZM[x][y+2]!=0&&YZM[x+1][y+2]!=0&&YZM[x+2][y+2]!=0&&YZM[x+3][y+2]==0&&YZM[x+4][y+2]==0&&YZM[x+5][y+2]==0 &&
YZM[x][y+3]==0&&YZM[x+1][y+3]!=0&&YZM[x+2][y+3]!=0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]==0&&YZM[x+5][y+3]==0) return '1';
if( YZM[x+1][y]!=0&&YZM[x+2][y]!=0&&YZM[x+3][y]!=0&&YZM[x+4][y]!=0&&YZM[x+5][y]==0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]!=0&&YZM[x+3][y+1]!=0&&YZM[x+4][y+1]!=0&&YZM[x+5][y+1]!=0 &&
YZM[x][y+2]==0&&YZM[x+1][y+2]==0&&YZM[x+2][y+2]==0&&YZM[x+3][y+2]==0&&YZM[x+4][y+2]==0&&YZM[x+5][y+2]!=0 &&
YZM[x][y+3]==0&&YZM[x+1][y+3]==0&&YZM[x+2][y+3]==0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]==0&&YZM[x+5][y+3]!=0 &&YZM[x][y+5]==0) return '2';
if( YZM[x+1][y]!=0&&YZM[x+2][y]!=0&&YZM[x+3][y]!=0&&YZM[x+4][y]!=0&&YZM[x+5][y]==0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]!=0&&YZM[x+3][y+1]!=0&&YZM[x+4][y+1]!=0&&YZM[x+5][y+1]!=0 &&
YZM[x][y+2]==0&&YZM[x+1][y+2]==0&&YZM[x+2][y+2]==0&&YZM[x+3][y+2]==0&&YZM[x+4][y+2]==0&&YZM[x+5][y+2]!=0 &&
YZM[x][y+3]==0&&YZM[x+1][y+3]==0&&YZM[x+2][y+3]==0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]==0&&YZM[x+5][y+3]!=0 &&YZM[x][y+5]!=0) return '3';
if( YZM[x+1][y]!=0&&YZM[x+2][y]!=0&&YZM[x+3][y]!=0&&YZM[x+4][y]==0&&YZM[x+5][y]==0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]!=0&&YZM[x+3][y+1]!=0&&YZM[x+4][y+1]!=0&&YZM[x+5][y+1]==0 &&
YZM[x][y+2]==0&&YZM[x+1][y+2]==0&&YZM[x+2][y+2]==0&&YZM[x+3][y+2]==0&&YZM[x+4][y+2]!=0&&YZM[x+5][y+2]==0 &&
YZM[x][y+3]==0&&YZM[x+1][y+3]==0&&YZM[x+2][y+3]==0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]==0&&YZM[x+5][y+3]==0) return '6';
if( YZM[x+1][y]!=0&&YZM[x+2][y]!=0&&YZM[x+3][y]!=0&&YZM[x+4][y]!=0&&YZM[x+5][y]!=0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]!=0&&YZM[x+3][y+1]!=0&&YZM[x+4][y+1]!=0&&YZM[x+5][y+1]!=0 &&
YZM[x][y+2]==0&&YZM[x+1][y+2]==0&&YZM[x+2][y+2]==0&&YZM[x+3][y+2]==0&&YZM[x+4][y+2]==0&&YZM[x+5][y+2]==0 &&
YZM[x][y+3]==0&&YZM[x+1][y+3]==0&&YZM[x+2][y+3]==0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]==0&&YZM[x+5][y+3]==0) return '7';
if( YZM[x+1][y]!=0&&YZM[x+2][y]!=0&&YZM[x+3][y]!=0&&YZM[x+4][y]!=0&&YZM[x+5][y]!=0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]!=0&&YZM[x+3][y+1]!=0&&YZM[x+4][y+1]!=0&&YZM[x+5][y+1]!=0 &&
YZM[x][y+2]!=0&&YZM[x+1][y+2]!=0&&YZM[x+2][y+2]==0&&YZM[x+3][y+2]==0&&YZM[x+4][y+2]==0&&YZM[x+5][y+2]==0 &&
YZM[x][y+3]!=0&&YZM[x+1][y+3]!=0&&YZM[x+2][y+3]==0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]==0&&YZM[x+5][y+3]==0) return '5';
if( YZM[x+1][y]!=0&&YZM[x+2][y]!=0&&YZM[x+3][y]!=0&&YZM[x+4][y]==0&&YZM[x+5][y]==0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]!=0&&YZM[x+3][y+1]!=0&&YZM[x+4][y+1]!=0&&YZM[x+5][y+1]!=0 &&
YZM[x][y+2]!=0&&YZM[x+1][y+2]==0&&YZM[x+2][y+2]==0&&YZM[x+3][y+2]==0&&YZM[x+4][y+2]!=0&&YZM[x+5][y+2]!=0 &&
YZM[x][y+3]==0&&YZM[x+1][y+3]==0&&YZM[x+2][y+3]==0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]==0&&YZM[x+5][y+3]!=0) return '9';
if( YZM[x+1][y]!=0 && YZM[x+2][y]==0 && YZM[x+3][y]==0 && YZM[x+4][y]==0 && YZM[x+5][y]==0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]==0&&YZM[x+3][y+1]==0&&YZM[x+4][y+1]==0&&YZM[x+5][y+1]==0 &&
YZM[x][y+2]!=0&&YZM[x+1][y+2]!=0&&YZM[x+2][y+2]==0&&YZM[x+3][y+2]==0&&YZM[x+4][y+2]==0&&YZM[x+5][y+2]==0 &&
YZM[x][y+3]!=0&&YZM[x+1][y+3]!=0&&YZM[x+2][y+3]==0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]==0&&YZM[x+5][y+3]==0) return '4';
if( YZM[x+1][y]!=0&&YZM[x+2][y]!=0&&YZM[x+3][y]!=0&&YZM[x+4][y]!=0&&YZM[x+5][y]==0 &&
YZM[x][y+1]!=0&&YZM[x+1][y+1]!=0&&YZM[x+2][y+1]!=0&&YZM[x+3][y+1]!=0&&YZM[x+4][y+1]!=0&&YZM[x+5][y+1]!=0 &&
YZM[x][y+2]!=0&&YZM[x+1][y+2]==0&&YZM[x+2][y+2]==0&&YZM[x+3][y+2]==0&&YZM[x+4][y+2]!=0&&YZM[x+5][y+2]!=0 &&
YZM[x][y+3]!=0&&YZM[x+1][y+3]==0&&YZM[x+2][y+3]==0&&YZM[x+3][y+3]==0&&YZM[x+4][y+3]!=0&&YZM[x+5][y+3]!=0) return '8';
return -1;
}
extern "C" _declspec(dllexport) int _stdcall main()
{
FILE *fp=fopen(BMP_filename,"rb");//以二进制只读方式打开BMP文件
for(i=0;i<54;i++)temp=fgetc(fp);//跳过54个字节的文件头数据
for(y=H-1;y>=0;y--)//BMP图片数据是倒序存储的,据说是为了下载显示方便,呵呵
{
for(x=0;x<W;x++){YZM_red[x][y]=fgetc(fp);YZM_green[x][y]=fgetc(fp);YZM_blue[x][y]=fgetc(fp);}
//依次读取每个像素的RGB值
}
fclose(fp);//关闭文件for(x=0;x<W;x++)for(y=0;y<H;y++)
{
if(YZM_red[x][y]*0.3+YZM_green[x][y]*0.6+YZM_blue[x][y]*0.1<150)YZM[x][y]=1;else YZM[x][y]=0;
//red*0.3+green*0.6+blue*0.1 是计算亮度的公式
}
//如果图片里有干扰点,可以用下面的语句去除。
for(x=1;x<W-1;x++)for(y=1;y<H-1;y++)
{
if(YZM[x][y]==1 && YZM[x-1][y-1]==0 && YZM[x][y-1]==0 && YZM[x+1][y-1]==0 && YZM[x-1][y]==0 && YZM[x+1][y]==0 && YZM[x-1][y+1]==0 && YZM[x][y+1]==0 && YZM[x+1][y+1]==0)YZM[x][y]=0;
//如果一个点的值是1,而且它的周围8个点的值都是0,那么这个点就是干扰点
}//for(y=0;y<H;y++) { for(x=0;x<W;x++) printf(" %c",YZM[x][y]+'0'); printf("\n"); }
for(x=0;x<W;x++)
{ s=0;
for(y=0;y<H;y++)s=s+YZM[x][y];
if(s>0)rec[x]=1;else rec[x]=0;//rec记录数组的断连情况
}
for(i=0,x=1;x<W-1;x++)if(rec[x-1]==0 && rec[x]==1 && rec[x+1]==1){i++;lf[i]=x;}//计算每个字符的左边界
for(i=0,x=1;x<W-1;x++)if(rec[x-1]==1 && rec[x]==1 && rec[x+1]==0){i++;rt[i]=x;}//计算每个字符的右边界
for(i=1;i<=N;i++)for(x=0;x<W;x++)for(y=0;y<H;y++) if(x>=lf[i] && x<=rt[i] && YZM[x][y]==1)YZM[x][y]=i;
for(y=H-1;y>=0;y--)for(x=0;x<W;x++)for(i=1;i<=N;i++)if(YZM[x][y]==i)up[i]=y;//计算每个字符的上边界*///for(y=0;y<H;y++) { for(x=0;x<W;x++) printf(" %c",YZM[x][y]+'0'); printf("\n"); }
for(y=0;y<H;y++)
{
for (x=0;x<W;x++)
{
if (YZM[x][y]==1)
{a=a+1;
if (a==1)
{
x1=x;
y1=y;
}
}
if (YZM[x][y]==2)
{
b=b+1;
if (b==1)
{
x2=x;
y2=y;
}
}
if (YZM[x][y]==3)
{
c=c+1;
if (c==1)
{
x3=x;
y3=y;
}
}
if (YZM[x][y]==4)
{
d=d+1;
if (d==1)
{
x4=x;
y4=y;
}
}
}
}result[0]=check(x1, y1);
result[1]=check(x2, y2);
result[2]=check(x3, y3);
result[3]=check(x4, y4); ofstream fout("3.txt",ios::out);
fout<<result;
//fout <<result;
//cout<<result<<endl;
fout.close();
return 0;
}这是dll的代码
声明
Private Declare Function main Lib "c:\imgdll.dll" () As Integer调用
call main()