Alle Beiträge von Klotzkopp
-
Rekursionstiefe merken
Verpass der rekursiven Funktionen einen weiteren Parameter: void Recurse( int nDepth ) { ... Recurse( nDepth + 1 ); } [/code]
-
Problem mit Klasseneinbindung
Das #include "stdafx.h" muss aus der Headerdatei raus und in die cpp-Datei rein. Falls das nicht hilft: (Hab's hier leider nur auf Englisch, also nagel mich nicht auf die genauen Worte fest) Projekt->Einstellungen->(Deine cpp-Datei auswählen)->Register "C/C++". In der Listbox "vorkompilierte Header" auswählen, dann den ersten Punkt ("nicht benutzen") auswählen. Ach ja, #include "stdafx.h" sollte immer vor allen anderen #includes stehen <FONT COLOR="#a62a2a" SIZE="1">[ 16. November 2001 09:27: Beitrag 4 mal editiert, zuletzt von Klotzkopp ]</font>
-
Rand() begrenzen
@Saturo: noch ein Hinweis: Modulo 10 liefert Dir Zufallszahlen von 0 bis 9 (!).
-
Visual Components Ordner fehlt in VC++ 6.0
Ich hab hier die Enterprise Edition, und da sind die Components drauf.
-
Portscanner ...
@Crush: Ist Accept nicht für die "lauschende" Seite gedacht?
-
immer nur DOS-Programme?
"wenn allewelt Windows benutzt"? Meinst Du das ernst? Ich weiß ja nicht, was für Dich "allewelt" ist, aber es gibt noch andere Dinge außer Windows-Anwendersoftware. Es gibt Programme, die brauchen kein GUI, und es gibt Programme, die mit GUI nicht denkbar sind. Nicht jeder Programmierer will seine Software von riesigen proprietären Laufzeitbibliotheken abhängig machen.
-
Portscanner ...
Das Programm geht in einer Schleife durch alle Portnummern von 1 bis zur angegebenen und versucht, eine TCP-Verbindung zum Zielrechner auf diesem Port aufzubauen. Falls es klappt (auf dem Zielrechner hat jemand auf diesem Port "gehorcht"), wird "OFFEN!" ausgegeben und die Verbindung gleich wieder geschlossen. Du kannst den Zugriff z.B. beschleunigen, indem Du mehrere Threads startest.
-
Festplatte durchsuchen lassen?
Noch eine Möglichkeit: Lass "dir" (bzw. "ls") die Arbeit tun, leite die Ergebnisse in eine Datei um, die Du dann einliest. system( "dir c:\\*.xyz /s > find.txt" );
-
Festplatte durchsuchen lassen?
Du kannst mit FindFirstFile und FindNextFile unter Win32 ein bestimmtes Verzeichnis nach Dateien durchsuchen, wobei Du auch Wildcards (*,?) angeben kannst. Um die Rekursion der Verzeichnisse wirst Du Dich aber wohl oder übel selbst kümmern müssen.
-
Pfad der Exe-Datei
Versuchs mal mit GetModuleFileName. Ganz ohne MFC .
-
Datum anzeigen
printf ("GONG!!Die Zeit, es ist der %02d.%02d.%04d, %02d.%02d.%02d\n", tbuf->tm_mday, tbuf->tm_mon, tbuf->tm_year + 1900, tbuf->tm_hour, tbuf->tm_min, tbuf->tm_sec);
-
Kopieren des Inhalten von argv[?]!?
Was ist argv1? Wenn das ein char-Array ist, dann muss der Index weg. <FONT COLOR="#a62a2a" SIZE="1">[ 31. Oktober 2001 10:13: Beitrag 1 mal editiert, zuletzt von Klotzkopp ]</font>
-
Wie sort-Methode von Listen benutzen??
Wenn Du eine Liste von Objekten hast, dann ist es am einfachsten, wenn Du der Objektklasse einen kleiner-Operator verpasst. class CItem { public: operator<( CItem& secondOperand ) { return m_nData < secondOperand.m_nData; } private: int m_nData; }; [/code] Dann funktioniert list::sort auch mit einer Liste von CItem-Objekten. Und wonach sortiert werden soll, kannst Du im Code des Operator selbst bestimmen. Wenn Du nach wechselnden Attributen sortieren willst, könntest Du das z.B. über ein statisches Attribut steuern.
-
Wie sort-Methode von Listen benutzen??
Wenn Du eine STL-Liste benutzt std::list<int> Liste; dann sollte das reichen, um die Werte aufsteigend zu sortieren: Liste.sort();
-
Computernamen herausfinden!
Für gethostname brauchst Du Winsock2.h. Außerdem must Du die Ws2_32.lib reinlinken. Einfacher wärs wahrscheinlich, wenn Du GetComputerName und GetUserName benutzt. Für die brauchst Du windows.h und kernel32.lib bzw. advapi32.lib. Alles natürlich nur für den Fall, dass wir von Windows reden
-
Programm wird inaktiv (nicht mehr ansprechbar)! Wie Abhilfe??
Also als erstes brauchst Du eine Thread-Funktion. Rückgabetyp und Parameter sind hierbei festgelegt. Die Thread-Funktion muss entweder global oder statisch sein, damit kein zusätzlicher this-pointer mit übergeben wird. Damit die Thread-Funktion auf die Member Deiner Klasse zugreifen kann, übergibt man meist einen this-Pointer an einen "Threadstart-Funktion", die dann die eigentliche Threadfunktion aufruft. // YourDlg.h class CYourDlg : public CDialog: ... static UINT __stdcall tmpWorkerThread( void* pParam ); void WorkerThread(); ... // YourDlg.cpp UINT CYourDlg::tmpWorkerThread( void* pThis ) { CYourDlg* pDlg = (CYourDlg*) pThis; pDlg->WorkerThread(); } void CYourDlg::WorkerThread() { // was auch immer getan werden muss } [/code] Den Thread startest Du dann mit [code] HANDLE hThread = (HANDLE) _beginthread( tmpWorkerThread, 0, this); CloseHandle( hThread ); Ganz wichtig, leider hab ich die Namen hier nur auf Englisch: In den Projekt-Settings, Register C/C++, Use run-time library: eine Multithreading-Runtime auswählen, in Deinem Fall vermutlich am besten "Debug Multithreaded DLL".
-
Programm wird inaktiv (nicht mehr ansprechbar)! Wie Abhilfe??
Der TaskManager von Windows hat seine ganz eigene Auffassung von Prozesszuständen. 'Wird ausgeführt' bedeutet eigentlich 'Wartet', und 'Keine Rückmeldung' heißt soviel wie 'Hat viel zu tun'. Dass Dein Programm, nicht mehr reagiert während es arbeitet, liegt daran, dass der einzige Thread Deiner Anwendung beschäftigt ist. Wenn Du das umgehen willst, dann musst Du einen weiteren Thread starten, der dann die Arbeit erledigt (einen Worker-Thread, wie MS das nennt). Dann kann der erste Thread (der User-Interface-Thread) weiterhin dafür sorgen, dass das Fenster sich so verhält, wie man es von einem Fenster erwartet. Dann ist auch der TaskManager zufrieden. Ein zweiter Thread bringt allerdings einige neue Probleme mit sich. Der 'Splitten'-Button (oder Menü-Eintrag, was auch immer) muss auf 'disabled' gesetzt werden, damit man nicht noch einen dritten Thread starten kann, während der zweite noch läuft. Außerdem solltest Du verhindern, dass das Programm beendet wird, während der Worker-Thread noch läuft, damit die Anwendung in einem definierten Zustand terminiert.
-
HILFEHILFE - WIE KANN ICH DEN BUTTON AKTIVIEREN?!?!?!
Such Dir besser gleich die Fensterklasse des Buttons mit dem Spy++ raus. Zum Klicken hatte ich schon mal was geschrieben: void MouseClick( HWND hWnd ) { if( !hWnd ) return; RECT rect; POINT mousePos; GetCursorPos( &mousePos ); ::GetWindowRect( hWnd, &rect ); int left = rect.left; int top = rect.top; ::GetClientRect( hWnd, &rect ); int width = rect.right; int height = rect.bottom; SetCursorPos( left + width / 2, top + height / 2 ); ::SendMessage( hWnd, WM_LBUTTONDOWN, MK_LBUTTON, x + 65536 * y ); ::SendMessage( hWnd, WM_LBUTTONUP, MK_LBUTTON, x + 65536 * y ); SetCursorPos( mousePos.x, mousePos.y ); } [/code] Prüf aber bitte, ob die Nutzungsbedingungen von WEB.DE solche Tools nicht verbieten
-
Probleme mit dem Date Time Picker unter Visual C++ 6.0! Datum immer auf 1970!
Initialisiere Dein CTime-Objekt in der OnInitDialog bzw. InitInstance: deinCTimeObject = CTime::GetCurrentTime(); [/code]
-
Header Datei in Visualstidio einbinden
Das hier funktioniert unter VC++, dafür aber wahrscheinlich unter Borland nicht: void MyGotoXY(int x, int y) { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); COORD c; c.X = x; c.Y = y; SetConsoleCursorPosition( hStdout, c ); } [/code] Du brauchst dafür <windows.h>.
-
Header Datei in Visualstidio einbinden
Die conio.h von VC++ hat kein gotoxy
-
Registryzugriffe ohne MFC
Hier mal ein Beispiel: Erzeugen der Wertes "MeinString" mit dem Inhalt "Mein Stringinhalt" im Schlüssel "HKLM\Software\MeineApp" HKEY hkey; char* pszString = "Mein Stringinhalt"; RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\MeineApp", 0, KEY_ALL_ACCESS, &hkey); RegSetValueEx( hKey, "MeinString", 0, REG_SZ, (const BYTE*) pszString, strlen( pszString )+1 ); [/code] Zum Auslesen des Werts den Key wie wie oben öffnen, dann: [code] char pszBuffer[101]; DWORD dwDataSize = 100; RegQueryValueEx( hKey, "MeinString", NULL, REG_SZ, (BYTE*) pszBuffer, &dwDataSize ); Am Rande: Die "Profile"-Methoden (sowohl MFC als auch nicht-MFC) schreiben unter Wintendo (9x,ME) immer noch in die Win.ini (wenn auch in eine gecachte), unter NT/2000 werden die Werte aber in der Registry abgelegt.
-
LockWorkStation()
Es gibt nichts vergleichbares unter NT. Aber hier wird eine Alternative beschrieben: http://support.microsoft.com/support/kb/articles/Q262/6/46.ASP
-
Ungenauigkeiten bei float-Zahlen
Die Ungenauigkeiten bei Fließkommatypen sind nicht nur durch die festgelegte Stellenanzahl bedingt. Jeder Bruch, dessen Nenner keine Potenz von zwei ist (z.B. 3/10), hat im Dualsystem unendlich viele Nachkommastellen. Man kann eine solche Zahl im Dualsystem nicht mit allen Stellen darstellen.
-
dynamischer speicher
Du weist szBuffer in f neu zu. Diese Änderung wirkt sich aber nicht auf den Puffer aus, mit dem Du die Funktion aufrufst. Da Du den Zeiger nicht als Referenz übergibt, wird eine Kopie des Zeigers auf dem Stack angelegt. Diese Kopie wird gelöscht, nachdem f beendet ist. Deklariere f einfach als void f( char*& szBuffer ) Wenn Du new und delete verwenden willst, dann musst Du Dich selbst darum kümmern, den Inhalt des alten Puffers in den neuen zu kopieren und den alten zu löschen. <FONT COLOR="#a62a2a" SIZE="1">[ 12. September 2001 11:31: Beitrag 1 mal editiert, zuletzt von Klotzkopp ]</font>