初学者提问: C++ Builder6.0中如何引用自定义类??????

mesql 2004-04-01 12:08:08
我自定义了一个类(和主程序在同一工程中),然后在主程序中引用它时老是出错,怎么解决啊???我的引用方式有问题吗???

下面是我的代码:
1.自定义类头文件
------------------------------------------------------------------------
//---------------------------------------------------------------------------

#ifndef FTPServiceH
#define FTPServiceH
//---------------------------------------------------------------------------
#include <wininet.h>
//---------------------------------------------------------------------------

class TMyFtpClient: public TObject
{
private:
DWORD FContext;
HINTERNET FINet;
HINTERNET FFtpHandle;
public:
AnsiString FServer;
INTERNET_PORT nServerPort;
bool FConnceted;
protected:
__fastcall ~TMyFtpClient(void);
public:
__fastcall TMyFtpClient(void);
bool __fastcall Connect(void);

};
extern TMyFtpClient *MyFtpClient;
#endif
--------------------------------------------------------------------------
2.自定义类CPP文件
-------------------------------------------------------------------------
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "FTPService.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)
//----------------------------------------------------------------------------
TMyFtpClient *MyFtpClient;

__fastcall TMyFtpClient::TMyFtpClient(void)
{
FINet=InternetOpen("MyFTPClient",0,NULL,0,0);
FFtpHandle=NULL;
FConnceted=false;
}

__fastcall TMyFtpClient::~TMyFtpClient(void)
{
if(FINet!=NULL)
{
InternetCloseHandle(FINet);
}
if(FFtpHandle!=NULL)
{
InternetCloseHandle(FFtpHandle);
}
}

bool __fastcall TMyFtpClient::Connect(void)
{
AnsiString ErrorMsg;
AnsiString CR1("\x00D\x00A");
FContext=255;
FFtpHandle=InternetConnect(FINet,FServer.c_str(),nServerPort,NULL,NULL,INTERNET_SERVICE_FTP,0,FContext);
if(FFtpHandle==NULL)
{
ErrorMsg="Connection failed"+CR1+"Server:"+FServer;
throw Exception(ErrorMsg);
}
else
FConnceted=true;
return true;
}
--------------------------------------------------------------------------
3.主程序头文件:
--------------------------------------------------------------------------
//---------------------------------------------------------------------------

#ifndef FTPClientServiceH
#define FTPClientServiceH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
#include <wininet.h>
//---------------------------------------------------------------------------
class TFTPClient : public TForm
{
__published: // IDE-managed Components
TButton *btnConnect;
void __fastcall btnConnectClick(TObject *Sender);
private: // User declarations
public: // User declarations
//HINTERNET FINet;
__fastcall TFTPClient(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFTPClient *FTPClient;
//---------------------------------------------------------------------------
#endif
--------------------------------------------------------------------------
4.主程序CPP文件:
--------------------------------------------------------------------------
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "FTPClientService.h"
#include "FTPService.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"



TFTPClient *FTPClient;
//---------------------------------------------------------------------------
__fastcall TFTPClient::TFTPClient(TComponent* Owner)
: TForm(Owner)
{
// FINet=InternetOpen("FTPClient",0,NULL,0,0);
}
//---------------------------------------------------------------------------
void __fastcall TFTPClient::btnConnectClick(TObject *Sender)
{
MyFtpClient->FServer="192.168.39.139";
MyFtpClient->nServerPort=61129;
MyFtpClient->Connect();
if(MyFtpClient->FConnceted)
ShowMessage("Conncetion succeeded!");

}
//---------------------------------------------------------------------------

然后我编译是没有问题的,但在调试时打开编译后的EXE文件时,老是报错如下:
Access violation at address 400068A4 in module 'rtl60.bpl'.Write of address 00000010.

这是为什么啊???是我引用自定义类的方法有错误吗?????
请各位高手指教啊!!!!!!!!
...全文
149 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mesql 2004-04-05
  • 打赏
  • 举报
回复
对不起大家啊,结贴时论坛好象刚刚出问题,所以贴结了但发的分不见了,真郁闷!!!!
请以上两位大哥原谅哦:(
mesql 2004-04-05
  • 打赏
  • 举报
回复
呵呵,已经按照xiaoshi0大哥的指教搞定拉,谢谢xiaoshi0大哥哦
揭贴发分了拉!!!
xiaoshi0 2004-04-02
  • 打赏
  • 举报
回复
呵呵,你没明白我的意思,我是说,要在你的析构函数中把你的类里的所有申请了内存空间的变量消去,然后再调用基类的析构函数
xiaoshi0 2004-04-01
  • 打赏
  • 举报
回复
然后在用的时候还要初始化:
TMyFtpClient *MyFtpClient = new TMyFtpClient();
我楼上的肯定不行,你定义的类的构造函数是没有参数的,所以不能用this指针
xiaoshi0 2004-04-01
  • 打赏
  • 举报
回复
声明类的方法:头文件换成这个
//---------------------------------------------------------------------------

#ifndef FTPClientServiceH
#define FTPClientServiceH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
#include <wininet.h>
//---------------------------------------------------------------------------
class TFTPClient : public TForm
{
__published: // IDE-managed Components
TButton *btnConnect;
void __fastcall btnConnectClick(TObject *Sender);
private: // User declarations
public:
TMyFtpClient *MyFtpClient; add by xiaoshi0
//HINTERNET FINet;
__fastcall TFTPClient(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFTPClient *FTPClient;
//---------------------------------------------------------------------------
#endif
WbtServer 2004-04-01
  • 打赏
  • 举报
回复
你修改一下这个方法
void __fastcall TFTPClient::btnConnectClick(TObject *Sender)
{
TMyFtpClient *MyFtpClient=new TMyFtpClient(this);
MyFtpClient->FServer="192.168.39.139";
MyFtpClient->nServerPort=61129;
MyFtpClient->Connect();
if(MyFtpClient->FConnceted)
ShowMessage("Conncetion succeeded!");

}
注意用完要释放资源
delete MyFtpClient;
mesql 2004-04-01
  • 打赏
  • 举报
回复
xiaoshi0大哥,你说话别说一半啊,那该在我的主程序的头文件里怎么声明啊??
我在引用窗体类时并不需要这样做啊,我只需要把窗体类头文件包括进去就可以引用啊
这又是为什么呢???
请xiaoshi0大哥在指教拉:)
先谢谢了啊
xiaoshi0 2004-04-01
  • 打赏
  • 举报
回复
没见你在主程序的头文件中声明该类呀,那你怎么调用呢?
mesql 2004-04-01
  • 打赏
  • 举报
回复
但是C++ Builder中不提倡直接调用TObject的析构函数以及Free()函数啊,而是建议直接使用delete操作符,那我这该怎么使用呢??
还是请xiaoshi0大哥以及其他高手帮我解答啊,感谢!!
xiaoshi0 2004-04-01
  • 打赏
  • 举报
回复
你那个不是有析构函数么,在析构函数中调用TObject的析构函数就可以了
mesql 2004-04-01
  • 打赏
  • 举报
回复
我试过了啊,不能执行delete MyFtpClient;啊,对了,那我用完MyFtpClient后它是自己就释放掉它所占用的空间吗?如果不是自动的,我又该 这样释放它所占用的资源呢???
请xiaoshi0大哥以及其他高手帮我解答啊,感谢啊!!!!!!!!
mesql 2004-04-01
  • 打赏
  • 举报
回复
你好拉, xiaoshi0大哥,按照你说的那样做已经解决那个错误拉,但我需要像 WbtServer() 大哥那样说的在不用MyFtpClient对象时应该释放它吗,即执行delete MyFtpClient。
这样有必要或最好应该这样做吗?在内存管理方面我还是不很懂啊

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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