"David White" <no@email.provided> wrote in message news:<Xp******************@nasal.pacific.net.au>.. .
"Kyle Teague" <si********@hotmail.com> wrote in message
news:d4**************************@posting.google.c om... I have a list of pointers to structs as a private member of a class.
If I call begin() in the same function as I added the data then no
access violation occurs. However, if I try to call begin() in a member
function of the same class I get a memory access violation.
For example:
// this is fine, no error
Possibly fine, but not necessarily. The lack of an adverse reaction does not
always mean that all is well.
void CBase::FuncA( void ) {
No need for 'C' on your class names.
http://www.jelovic.com/articles/stupid_naming.htm
plugin_info_t *plugin_info = new plugin_info_t;
plugin_info->pPluginSend = ProcPluginSend;
plugin_info->pGetUserList = 0;
lstPlugins.push_back(plugin_info);
list<plugin_info_t*>::iterator i;
i = lstPlugins.begin();
}
// this causes an access violation
void CBase::FuncB( void ) {
list<plugin_info_t*>::iterator i;
i = lstPlugins.begin();
}
There's nothing obviously wrong. You'll need to give us the definition of
class CBase and the code that creates the CBase object and calls these
members. The symptom suggests that the CBase object is invalid (e.g., been
destroyed) at the time you call FuncB(), because a call to the list's
begin() should not crash, whether you have added any items to the list or
not.
DW
My actual class was not named CBase, sorry for the confusion. By the
way, it crashes for ALL the lists at the same point. I've included
what was needed for the class, it
struct plugin_info_t;
struct user_info_t;
typedef int (* PluginMainProc)(UINT event, WPARAM wParam, LPARAM
lParam);
typedef std::list<user_info_t*>& (* GetUserListProc)();
typedef int (* GetBattleSocketProc)();
typedef LRESULT (* PluginSendProc)(UINT id, WPARAM wParam, LPARAM
lParam);
typedef BOOL (* BattleIncomingProc)(BYTE id, WORD length, LPVOID
data);
typedef BOOL (* MessageIncomingProc)(DWORD id, DWORD ping, DWORD
flags, LPSTR name, LPSTR text);
struct plugin_info_t
{
DWORD cVersion;
char cTitle[256];
PluginSendProc pPluginSend;
GetUserListProc pGetUserList;
BattleIncomingProc cBattleIncoming;
MessageIncomingProc cMessageIncoming;
};
struct user_info_t {
char name[64];
char statstring[512];
unsigned long flags;
unsigned long ping;
};
using namespace std;
LRESULT ProcPluginSend(UINT id, WPARAM wParam, LPARAM lParam);
class PluginHandler
{
string plugdir;
list<HMODULE> lstInstances;
list<FARPROC> lstProcs;
list<plugin_info_t*> lstPlugins;
public:
PluginHandler(char *dir);
~PluginHandler();
void GetPlugins();
int LoadPlugin(char *file);
void SendBNCSData(DWORD id, DWORD ping, DWORD uflags, LPSTR name,
LPSTR text);
};
PluginHandler::PluginHandler(char *dir)
{
plugdir = dir;
}
//crashes here
PluginHandler::~PluginHandler()
{
list<plugin_info_t*>::iterator i;
for(i=lstPlugins.begin(); i!=lstPlugins.end(); i++)
delete *i;
list<HMODULE>::iterator j;
for(j=lstInstances.begin(); j!=lstInstances.end(); j++)
FreeLibrary(*j);
}
void PluginHandler::GetPlugins()
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
char *path = new char[plugdir.size() + 3];
strcpy(path, plugdir.c_str());
strcat(path, "\\*");
hFind=FindFirstFile(path, &FindFileData);
do {
if( FindFileData.dwFileAttributes == 0x20) {
char *p = FindFileData.cFileName;
// is this a dll? if it is, load it
if (!strnicmp(p + strlen(p) - 4, ".dll", 4))
LoadPlugin(p);
}
} while ( FindNextFile(hFind, &FindFileData) );
FindClose(hFind);
delete [] path;
}
//crashes here too
void PluginHandler::SendBNCSData(DWORD id, DWORD ping, DWORD uflags,
LPSTR name, LPSTR text)
{
list<plugin_info_t*>::iterator i;
i = lstPlugins.begin();
}
LRESULT ProcPluginSend(UINT id, WPARAM wParam, LPARAM lParam)
{
/*switch(id) {
case ZBF_APPENDTEXT:
cout << (char *)lParam << endl;
//control->_richedit.AppendText((COLORREF)wParam, (char *)lParam);
return 0;
case ZBF_TIMESTAMP:
cout << "[TIMESTAMP] ";
return 0;
case ZBF_SENDTEXT:
pBot->SendText((char *)lParam);
//BnetSend((char *)lParam);
//control->_sendtext.Clear();
return 0;
} */
return -1;
}