Adding items to a list
-
even in C# you need to have a ToString method. How would C++ what you actually want to print. That being said. What do you want to print? The id? In that case you could have an implicit cast to QString like:
@
class ProcInfo
{
public:
//code
operator QString() const
{
return QString::number(id);
}
};
@
or you could call QString::number in the loop instead of adding an implicit cast function:
@
ui->myList->addItem(QString::number((*p).id));
@ -
[quote author="loladiro" date="1312196973"]even in C# you need to have a ToString method. How would C++ what you actually want to print. [/quote]
No you don't in C#, because when you create a class it automatically has a base ToString() method which is automatically used in certain controls like listboxes without being called (although the string would be simply the class name unless you override the method) I assumed C++ would be no different but clearly it is.
Thanks for the help.
-
The posts must have crossed in the air ;). The QString() const method is an "explicit coversion operator":http://msdn.microsoft.com/en-us/library/ts48df3y(v=vs.80).aspx . However, be aware that there are also many bugs that may follow from the misuse of this laguage feature.
EDIT: you can use it just like ou would in C# (i.e. without doing anything special)
-
Actually there are more compile errors I should have mentioned which are most likely causing this:
error: no match for 'operator=' in 'p = procList.std::list<_Tp, _Alloc>::begin with _Tp = int, _Alloc = std::allocator<int>'
-
Sorry but I can't reproduce. This all works:
@
class ProcInfo
{
public:
int id;
ProcInfo() : id(1234)
{}
operator QString() const
{
return QString::number(id);
}
};void print(QString print)
{
qDebug() << print;
}int main(int argc, char *argv[])
{
QApplication a(argc, argv);QList< ProcInfo > list1; list1 << ProcInfo(); QList< ProcInfo >::const_iterator i = list1.begin(); std::list< ProcInfo > list2; list2.push_back(ProcInfo()); std::list< ProcInfo >::const_iterator i2 = list2.begin(); print(*i2); print (*(i)); QListWidget widget; widget.addItem(*i); std::list< ProcInfo >::const_iterator p = list2.begin(); for (p=list2.begin();p!=list2.end(); ++p) { widget.addItem(*p); } widget.show(); const ProcInfo p2; print(p2); return a.exec();
}
@ -
Ok I've managed to get rid of all compile errors except this one:
error: expected type-specifier before 'QString'
And the error points to the operator:
@
class ProcInfo
{
public:
HANDLE Proc;
DWORD Base;
int ID;
operator QString() const
{
return QString::number(ID);
}
};@ -
That fixed that but now I have another problem /sigh.
I have declared std::list<ProcInfo> procList; inside a header file, and that header file is included in the main cpp file which I am doing this all in, however I get error:
error: multiple definition of `procList'
There is definitely only 1 definition and it's inside the h file so I'm a little confused, maybe c++ isn't for me :(
-
proc.h
@
#include <windows.h>
#include <list>
#include <QString>#ifndef PROC_H
#define PROC_H#endif // PROC_H
class ProcInfo
{
public:
HANDLE Proc;
DWORD Base;
int ID;
operator QString() const
{
return QString::number(ID);
}
};std::list< ProcInfo > procList;
bool createProcessList();
DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId);
@proc.cpp
@
#include <windows.h>
#include <iostream>
#include <string>
#include <tlhelp32.h>
#include "proc.h"
#include "misc.h"using namespace std;
bool createProcessList()
{
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (Process32First(snapshot, &entry;) == TRUE) { while (Process32Next(snapshot, &entry;) == TRUE) { char *procName; strcpy_wc(procName, entry.szExeFile); if (stricmp(procName, "pol") == 0) { ProcInfo *p = new ProcInfo(); p->Proc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,entry.th32ProcessID); p->ID = entry.th32ProcessID; p->Base = GetModuleBase("test.dll", entry.th32ProcessID); procList.push_back(*p); } } if (procList.empty()) return false; return true; } CloseHandle(snapshot); return 0;
}
DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId)
{
MODULEENTRY32 lpModuleEntry = {0};
HANDLE hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
if(!hSnapShot)
return NULL;
lpModuleEntry.dwSize = sizeof(lpModuleEntry);
BOOL bModule = Module32First( hSnapShot, &lpModuleEntry; );
while(bModule)
{
char *foundModule;
strcpy_wc(foundModule, lpModuleEntry.szModule);
if(!strcmp( foundModule, lpModuleName ) )
{
CloseHandle( hSnapShot );
return (DWORD)lpModuleEntry.modBaseAddr;
}
bModule = Module32Next( hSnapShot, &lpModuleEntry; );
}
CloseHandle( hSnapShot );
return NULL;
}
@That error points to line 11 in proc.cpp.
-
Well, my first comment is: fix your "include guards":http://en.wikipedia.org/wiki/Include_guard