高手帮忙啊,没法解决的问题

qmercury 2009-05-24 05:02:40
想将已有的代码加上窗体来代替命令行显示,在做dll导出类时遇到问题,请高手帮忙看看:
导入时的CClient.h:
class CClient
{
public:
CClient(void);
public:
virtual ~CClient(void);

public:
int receive(SOCKET t);
int sendls(SOCKET s);
int sendquit(SOCKET s);
int sendpwd(SOCKET s);
int sendcd(SOCKET h);
int sendput(SOCKET h);
int sendget(SOCKET h);


public:
SOCKET s;
SOCKET t;
SOCKET h;
int err;



};
导入时的CClient.cpp:
#include "Client.h"
#pragma once
#include<stdio.h>
#include<Winsock.h>
#include<windows.h>
#include<iostream>
#pragma comment(lib,"WS2_32.lib")
using namespace std;

CClient::CClient(void)
{
}

CClient::~CClient(void)
{
}

int CClient::receive(SOCKET t)
{
char buf2[50];
char buf3[10]="*";
memset(buf2,0,50); //申请内存
err=recv(t,buf2,50,0);//失败返回-1,成功返回接受的字节数
//返回读入数
if(err==-1)
{
cout<<"receive fail\n";
closesocket(t);
WSACleanup(); //关闭服务
}
if(buf3[0]==buf2[0])
return 1;
else
{
cout<<buf2;
return 0;
}
};
int CClient::sendls(SOCKET s)
{
char buf1[]="ls";
err=(send(s,buf1,50,0));
if(err<0)
{
cout<<"send fail !\n";
WSACleanup();
closesocket(s);
}
for(;;)
{
err=receive(s);
if(err==1)
{
return 0;
}
}
return 0;
};
int CClient::sendquit(SOCKET s)
{
char buf1[]="quit";
err=(send(s,buf1,50,0));
if(err<0)
{
cout<<"send fail!\n";
WSACleanup();
closesocket(s);
}
else
{
receive(s);
closesocket(s);
WSACleanup();
exit(0);
}
return 0;
};
int CClient::sendpwd(SOCKET s)
{
char buf1[]="pwd";
err=(send(s,buf1,50,0));
if(err<0)
{
cout<<"send fail!\n";
WSACleanup();
closesocket(s);
}
else
{
receive(s);
}
return 0;
};
int CClient::sendcd(SOCKET h)
{
char buf1[50]="cd";
send(h,buf1,50,0);
memset(buf1,0,50);
cout<<"请输入文件夹名 :";
cin>>buf1;
err=send(h,buf1,50,0);
if(err<0)
{
printf("send fail!\n");
closesocket(h);
WSACleanup();
exit(1);
}
else
{

char buf2[50];
memset(buf2,0,50);
err=recv(h,buf2,50,0);//失败返回-1,成功返回接受的安节数
if(err==-1)
{
cout<<"receive fail\n";
WSACleanup();
closesocket(h);
}
cout<<"当前工作目录为:"<<buf2;
}
return 0;
};
int CClient::sendput(SOCKET h)
{
char buf1[50]="send";
err=send(h,buf1,10,0);
if(err<0)
{
printf("send err!\n");
closesocket(h);
WSACleanup();
exit(1);
}
memset(buf1,0,50);
cout<<"请输入要上传的文件名 :";
cin>>buf1;

send(h,buf1,50,0);
FILE *fd;
fd=fopen(buf1,"rb");
if(fd==NULL)
{
cout<<"open"<<buf1<<" for reading failed!\n";
return 0;
}
char buf2[1024];
memset(buf2,0,1024);
for(;;)
{
int e=fread(buf2,1,1024,fd);
if(e==0)
break;
err=send(h,buf2,e,0);
if(err<0)
{
break;
}

}
char buf3[2]="&";
send(h,buf3,2,0);
cout<<"上传成功!\n";
fclose(fd);
return 0;
};

int CClient::sendget(SOCKET h)
{
char buf1[]="rec",buf2[20];
FILE *fd;
int count;
send(h,buf1,20,0);
memset(buf1,0,sizeof(buf1));
cout<<"请输入要下载的文件名:";
gets(buf2);
send(h,buf2,20,0);
fd=fopen(buf2,"wb");
//while(count==1024)
//{
//fd=fopen(buf2,"wb");
char buf3[1024],buf4[2]="@";
//memset(buf3,0,1024);
for(;;)
{
count=recv(h,buf3,sizeof(buf3),0);
fwrite(buf3,1,count,fd);
if((buf4[0]==buf3[0])||(count==-1))
{
break;
}
}
cout<<"下载成功!\n";
fclose(fd);
return 0;

};

导入时的mainctrl.cpp:
#include<stdio.h>
#include<Winsock.h>
#include<windows.h>
#include<iostream>
#include "Client.h"
#pragma comment(lib,"WS2_32.lib")
#pragma comment(linker, "/subsystem:console")

using namespace std;
int result;
void Main()
{
WSAData wsa;
WSAStartup(MAKEWORD(2,2),&wsa);
SOCKET s;
int err=0;


struct sockaddr_in addr;
char buf6[50];
cout<<"请输入服务器IP:\n";
cin>>buf6;



s=socket(AF_INET,SOCK_STREAM,0);
addr.sin_family=AF_INET;
addr.sin_port=htons(4999);

addr.sin_addr.S_un.S_addr=inet_addr(/*"127.0.0.1"*/buf6);
bind(s,(struct sockaddr *)&addr,sizeof(addr));

err=(connect(s,(struct sockaddr *)&addr,sizeof(addr)));//成功返回,失败返回-1;
if(err<0)
{
cout<<"连接失败!\n";
WSACleanup();
closesocket(s);
exit(1);
}
else
{
cout<<"连接成功!\n\n";

char buf1[50];
recv(s,buf1,50,0);
cout<<"当工作目录为:="<<buf1;
cout<<"输入'h',就可以得到帮助文件!\n";
}

for(;;)
{
char buf1[50];
//cin>>buf1;
cin>>buf1;
CClient client1;
switch(buf1[0])
{


case 'l':
client1.sendls(s);break;
case 'q':
client1.sendquit(s);break;
case 'p':
client1.sendpwd(s);break;
case 'c':
client1.sendcd(s);break;
case 's':
client1.sendput(s);break;
case 'r':
client1.sendget(s);break;
default:
cout<<"请输入需要运行的操作:\n";break;
}
}
}

编译报错:error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
上网查说是将系统中子系统改成windows..之后也是一样的,高手帮帮我,我要崩溃了
...全文
148 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzh9955 2009-05-24
  • 打赏
  • 举报
回复
太长了!
goodname 2009-05-24
  • 打赏
  • 举报
回复
如果说所有的都是一个dll的代码的话,main函数不用写。
qmercury 2009-05-24
  • 打赏
  • 举报
回复
还是不会。。吃了饭回来试试吧。
光宇广贞 2009-05-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qmercury 的回复:]
我是在写好CPP源码之后(源码可运行,但是是命令行的),想在此之上做个C#窗体,才将它做成dll导出类。。
[/Quote]

DllMain()

请重新生成一个DLL工程,然后贴代码,而不要这样直接用,这样省事儿。要么你就自己改入口。
qmercury 2009-05-24
  • 打赏
  • 举报
回复
我是在写好CPP源码之后(源码可运行,但是是命令行的),想在此之上做个C#窗体,才将它做成dll导出类。。
goodname 2009-05-24
  • 打赏
  • 举报
回复
从你给的程序来看应用程序可以是控制台程序。

所以你写main应该能行。

但是你把工程设置给修改的不一致了,所以工程需要winmain

你应该修改回来。
光宇广贞 2009-05-24
  • 打赏
  • 举报
回复
_tmain()

WinMain()

DllMain()

之类的,你都试试
arong1234 2009-05-24
  • 打赏
  • 举报
回复
你不能写个cpp文件就进行编译,你必须创建合适的工程在工程内做事
如果你不写工程,缺省好像是win32 app程序,而你需要的是console工程
[Quote=引用 7 楼 qmercury 的回复:]
void main()小写的也有问题啊。。报错是:
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
1>D:\My Documents\Visual Studio 2005\Projects\666\Debug\666.exe : fatal error LNK1120: 1 个无法解析的外部命令
[/Quote]
qmercury 2009-05-24
  • 打赏
  • 举报
回复
void main()小写的也有问题啊。。报错是:
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
1>D:\My Documents\Visual Studio 2005\Projects\666\Debug\666.exe : fatal error LNK1120: 1 个无法解析的外部命令
goodname 2009-05-24
  • 打赏
  • 举报
回复
情况是否有所改观,还有什么问题。

qmercury 2009-05-24
  • 打赏
  • 举报
回复
void main()小写的也有问题啊。。
光宇广贞 2009-05-24
  • 打赏
  • 举报
回复
void Main() ?
  • 打赏
  • 举报
回复
void Main()

同问
ltc_mouse 2009-05-24
  • 打赏
  • 举报
回复
void Main() ??
goodname 2009-05-24
  • 打赏
  • 举报
回复
void Main()// <---- void main()

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧