初学者提问: 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.

这是为什么啊???是我引用自定义类的方法有错误吗?????
请各位高手指教啊!!!!!!!!
...全文
135 12 打赏 收藏 转发到动态 举报
写回复
用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,825

社区成员

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

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