大家好,我现在有个问题都要死掉了
本人对vc知道的非常有限,现在我有个问题
我用vs.2003中vc++建了一个扩展存储过程,现在有个问题我都做了三天了,明天中午要再没答案我就玩完了。。
呵呵。
是这样的,在vc++编写的dll叫sql000的扩展存储过程使用的,有一个参数(sql2000调用这个dll函数时,代入的参数),在vb.net中我叫他string类型的,在vc中我也不知道应该叫什么类型,在vc中应该把这个参数定义成PBYTE 类型的,才能得到传入的参数,我现在有很多疑问
PBYTE IP;//我定义的变量,是想代入IP地址
1、我想把代入的参数变成const char* 类型的,也就是PBYTE 类型转const char*
2.我用强类型转换,(char*)IP,总是怪怪的,不是后面是乱码,就是程序出错,主要程序如下:
3.我建立的这个DLL,怎么设置断点,才能当sql2000调用这个dll时,能够中断.
4.PBYTE变量怎么转换成long或int类型的,在下边的注释上了://特别问题2,因为我不会,害得我只能在程序中就固定了这个端口号,就是把转进来的参数能转换成long类型的, 不能象我这样用个常量
4.特别问题1,在这个
addrSrv.sin_addr.S_un.S_addr=inet_addr((char*)IP)语句中,如果把(char*)IP直接换成"192.168.1.3"这种常量形式,socket马上就能把数据发出去,如果不换,那么在sql2000调用这个dll的时候,必须得'192.168.1.3 '(也就是说,得多加几个空格上去才行),不然就出错
BYTE bType;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL bfNull; // 记录入参是否为空(NULL)
ULONG ulMaxLen = 20; // 入参的最大长度,令为20字节
ULONG ulActualLen=0; // 入参的实际长度
PBYTE IP;
PBYTE PortNum;
if(srv_paraminfo(srvproc, 1, &bType, &cbMaxLen, &cbActualLen, NULL, &bfNull)!= SUCCEED)
{
wsprintf(spText, "获得IP的类型、长度等信息发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
} IP = (PBYTE)::malloc(cbActualLen);
memset(IP,0,sizeof(IP));
if ( IP == NULL)
{
wsprintf(spText, "为IP参数分配空间发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
if ( srv_paraminfo(srvproc, 1, &bType, &ulMaxLen, &ulActualLen, IP, &bfNull) != SUCCEED )
{
wsprintf(spText, "获得IP参数的值发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
// 获得PortNum参数的类型、长度等信息
if(srv_paraminfo(srvproc, 2, &bType, &cbMaxLen, &cbActualLen, NULL, &bfNull)!= SUCCEED)
{
wsprintf(spText, "获得PortNum参数的类型、长度等信息发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
char error[10]; PortNum = (PBYTE)::malloc(cbActualLen);
if ( PortNum == NULL)
{
wsprintf(spText, "为PortNum参数分配空间发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
if ( srv_paraminfo(srvproc, 2, &bType, &ulMaxLen, &ulActualLen, PortNum, &bfNull) != SUCCEED )
{
wsprintf(spText, "获得PortNum参数的值发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
//
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
//特别问题1:
addrSrv.sin_addr.S_un.S_addr=inet_addr((char*)IP); //显示ip地址,这里有时候就出现乱码
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, (char*)IP , SRV_NULLTERM);
addrSrv.sin_family=AF_INET;
//特别问题2:
addrSrv.sin_port=htons(5557); if (connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))!=0)
{
int errorcode=WSAGetLastError();
itoa(errorcode,error,10);
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, "失败" , SRV_NULLTERM);
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, (char*)error , SRV_NULLTERM); }
send(sockClient,("开始传输:",strlen(("开始传输:")+1,0);
closesocket(sockClient);
return XP_NOERROR ;
这个DLL主要目的是,把这个生成sql2000扩展存储过程所用的dll文件,然后,在sql2000的查询管理器中运行这个存储过程,并带入两个参数,一个是ip地址,一个是端口名
各位爷爷奶奶,我真的不行了,给你跪下了,快帮我一下,我qq是 64246410 马上联系我,可以吗
我就40分了,都拿来了
本人对vc知道的非常有限,现在我有个问题
我用vs.2003中vc++建了一个扩展存储过程,现在有个问题我都做了三天了,明天中午要再没答案我就玩完了。。
呵呵。
是这样的,在vc++编写的dll叫sql000的扩展存储过程使用的,有一个参数(sql2000调用这个dll函数时,代入的参数),在vb.net中我叫他string类型的,在vc中我也不知道应该叫什么类型,在vc中应该把这个参数定义成PBYTE 类型的,才能得到传入的参数,我现在有很多疑问
PBYTE IP;//我定义的变量,是想代入IP地址
1、我想把代入的参数变成const char* 类型的,也就是PBYTE 类型转const char*
2.我用强类型转换,(char*)IP,总是怪怪的,不是后面是乱码,就是程序出错,主要程序如下:
3.我建立的这个DLL,怎么设置断点,才能当sql2000调用这个dll时,能够中断.
4.PBYTE变量怎么转换成long或int类型的,在下边的注释上了://特别问题2,因为我不会,害得我只能在程序中就固定了这个端口号,就是把转进来的参数能转换成long类型的, 不能象我这样用个常量
4.特别问题1,在这个
addrSrv.sin_addr.S_un.S_addr=inet_addr((char*)IP)语句中,如果把(char*)IP直接换成"192.168.1.3"这种常量形式,socket马上就能把数据发出去,如果不换,那么在sql2000调用这个dll的时候,必须得'192.168.1.3 '(也就是说,得多加几个空格上去才行),不然就出错
BYTE bType;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL bfNull; // 记录入参是否为空(NULL)
ULONG ulMaxLen = 20; // 入参的最大长度,令为20字节
ULONG ulActualLen=0; // 入参的实际长度
PBYTE IP;
PBYTE PortNum;
if(srv_paraminfo(srvproc, 1, &bType, &cbMaxLen, &cbActualLen, NULL, &bfNull)!= SUCCEED)
{
wsprintf(spText, "获得IP的类型、长度等信息发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
} IP = (PBYTE)::malloc(cbActualLen);
memset(IP,0,sizeof(IP));
if ( IP == NULL)
{
wsprintf(spText, "为IP参数分配空间发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
if ( srv_paraminfo(srvproc, 1, &bType, &ulMaxLen, &ulActualLen, IP, &bfNull) != SUCCEED )
{
wsprintf(spText, "获得IP参数的值发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
// 获得PortNum参数的类型、长度等信息
if(srv_paraminfo(srvproc, 2, &bType, &cbMaxLen, &cbActualLen, NULL, &bfNull)!= SUCCEED)
{
wsprintf(spText, "获得PortNum参数的类型、长度等信息发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
char error[10]; PortNum = (PBYTE)::malloc(cbActualLen);
if ( PortNum == NULL)
{
wsprintf(spText, "为PortNum参数分配空间发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
if ( srv_paraminfo(srvproc, 2, &bType, &ulMaxLen, &ulActualLen, PortNum, &bfNull) != SUCCEED )
{
wsprintf(spText, "获得PortNum参数的值发生错误");
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, spText, SRV_NULLTERM);
return XP_ERROR;
}
//
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
//特别问题1:
addrSrv.sin_addr.S_un.S_addr=inet_addr((char*)IP); //显示ip地址,这里有时候就出现乱码
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, (char*)IP , SRV_NULLTERM);
addrSrv.sin_family=AF_INET;
//特别问题2:
addrSrv.sin_port=htons(5557); if (connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))!=0)
{
int errorcode=WSAGetLastError();
itoa(errorcode,error,10);
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, "失败" , SRV_NULLTERM);
srv_sendmsg(srvproc, SRV_MSG_INFO, 0, (DBTINYINT)0, (DBTINYINT)0, NULL, 0, 0, (char*)error , SRV_NULLTERM); }
send(sockClient,("开始传输:",strlen(("开始传输:")+1,0);
closesocket(sockClient);
return XP_NOERROR ;
这个DLL主要目的是,把这个生成sql2000扩展存储过程所用的dll文件,然后,在sql2000的查询管理器中运行这个存储过程,并带入两个参数,一个是ip地址,一个是端口名
各位爷爷奶奶,我真的不行了,给你跪下了,快帮我一下,我qq是 64246410 马上联系我,可以吗
我就40分了,都拿来了
1.用CString类型,CString类型可以直接赋值LPCTSTR(typedef /* [string] */ const TCHAR *LPCTSTR;)
2.htonl(端口号)
3.可以考虑使用trim,去掉空格