Anfänger sucht hilfe! Win32 -> MFC ??
-
Umwandeln ist schwierig. Mit dem Wizard eine neue MFC-Anwendung machen und dann deine einfache Funktionalität reinmachen ist wahrscheinlich einfacher.
-
-
kostenstelle schrieb:
wieviel bezahlst du denn?
hängt von der Leistung ab
-
@ fatbastard7904
Hier ist mein code:
#include "aw.h" #include <stdio.h> #include <stdlib.h> void handle_avatar_add (void); main (int argc, char *argv[]) { int rc; /* Prüfe Eingabeaufforderung */ if (argc < 3) { printf ("Benutzung: %s Citizen ID & Priv-Passwort\n", argv[0]); exit (1); } /* Initialisiere Active Worlds API */ if (rc = aw_init (AW_BUILD)) { printf ("API konnte nicht gestartet werden (Grund: %d)\n", rc); exit (1); } /* Installiere handler für avatar_add event */ aw_event_set (AW_EVENT_AVATAR_ADD, handle_avatar_add); /* create bot */ if (rc = aw_create (0, 5674, 0)) { printf ("Kann Bot nicht starten (Grund: %d)\n", rc); exit (1); } /* bot in das Universum einloggen */ aw_int_set (AW_LOGIN_OWNER, atoi (argv[1])); aw_string_set (AW_LOGIN_PRIVILEGE_PASSWORD, argv[2]); aw_string_set (AW_LOGIN_APPLICATION, "Harlekin TEST #1"); aw_string_set (AW_LOGIN_NAME, "SecBot"); if (rc = aw_login ()) { printf ("Kann nicht einloggen (Grund: %d)\n", rc); exit (1); } /* bot in die Welt "Germ@n" einloggen */ if (rc = aw_enter ("Germ@n")) { printf ("Kann nicht die Welt betreten (Grund: %d)\n", rc); exit (1); } /* Standort des bots festlegen 5.63N 41.29E 0.00a 169 */ aw_int_set (AW_MY_X, -41290); /* ####W -####E */ aw_int_set (AW_MY_Y, 0000); /* höhe */ aw_int_set (AW_MY_Z, 5630); /* ####N -####S */ aw_int_set (AW_MY_YAW, 1690); /* Richtung */ aw_int_set (AW_AVATAR_TYPE, 1); /* Avartar Typ */ if (rc = aw_state_change ()) { printf ("Kann Status nicht ändern (Grund: %d)\n", rc); exit (1); } /* Haupttätigkeit Schleife */ while (!aw_wait (-1)) ; /* Alles schließen */ aw_destroy (); aw_term (); return 0; } void handle_avatar_add (void) { char message[100]; sprintf (message, "Willkommen %s! Harlekin ist derzeit nicht da.", aw_string (AW_AVATAR_NAME)); aw_whisper (aw_int (AW_AVATAR_SESSION), message); sprintf (message, "Hinterlasse doch eine Nachricht am Terminal rechts von mir :)", aw_string (AW_AVATAR_NAME)); aw_whisper (aw_int (AW_AVATAR_SESSION), message); /* log the event to the console */ printf ("avatar_add: %s\n", aw_string (AW_AVATAR_NAME)); /* printf ("%s has session number %d\n", aw_string (AW_AVATAR_NAME), aw_int (AW_AVATAR_SESSION)); */ }
Ich habe die 6.0 Enterprise
-
estartu_de schrieb:
http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/start.htm
Danke das Buch habe ich selber gekauft
und bin ja auch da dran.. nur wird dort direkt mit MFC angefangen... ich habe aber Win32 und bräuchte diese umgewandelt.
-
Was benutzt du da für eine API? WinAPI ist es nicht.
-
rofl!!! schrieb:
Was benutzt du da für eine API? WinAPI ist es nicht.
"Active Worlds API" wird genutzt für Active Worlds Bot programmierung.
-
Hello again.
Also das was du da hast, ist ja erstmal nur ne klassische Konsolenanwendung, egal ob nun fuer win32 oder fuer Dos oder Linux kompiliert. Hat nu erstmal nix mit MFC oder Win32 Api zu tun.
Wenn du das innerhalb von ner MFC-basierten Applikation laufen lassen willst, kannst du erstmal einfach mit dem Assitenten in MS Visual Studio 6 ne Dialogfeldbasierte Applikation erschaffen (die sollte ja auch dann einfach gehen und zumindest OK und Abbrechen anzeigen, wie im Buch beschrieben) und bei der Funktion InitInstance klopst du einfach mal deinen gesamten Code aus der main da rein (Noch besser ist wohl OnInitDialog() wie im Buch beschrieben). Header noch einziehen und die eine Funktion global definieren (odr auch als Member, eigentlich egal) fuer diese Botgeschichte und fertig ist die Laube.
Ist zwar wenig sinnvoll und ziemlich dirty, aber immerhin laeuft der code dann in einer MFC Anwendung -g-.Wenn du dann mehr willst schrieb nochmal bitte.
Bye Harald
-
okay... habe ich versucht und bekomme folgendes:
--------------------Konfiguration: Test1_MFC - Win32 Debug--------------------
Kompilierung läuft...
Test1_MFCDlg.cpp
H:\PROJEKTE\Test1_MFC\Test1_MFCDlg.cpp(122) : error C2133: 'argv' : Unbekannte Groesse
H:\PROJEKTE\Test1_MFC\Test1_MFCDlg.cpp(199) : error C2143: Syntaxfehler : Fehlendes ';' vor 'return'
Fehler beim Ausführen von cl.exe.Test1_MFC.exe - 2 Fehler, 0 Warnung(en)
Ich finde aber diese Beiden Probleme nicht... argv wird wohl irgendwo definitiert werden müssen?
Hier ist der code - so richtig?
// Test1_MFCDlg.cpp : Implementierungsdatei // #include "stdafx.h" #include "Test1_MFC.h" #include "Test1_MFCDlg.h" #include "aw.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info" class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialogfelddaten //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung //}}AFX_VIRTUAL // Implementierung protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // Keine Nachrichten-Handler //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTest1_MFCDlg Dialogfeld CTest1_MFCDlg::CTest1_MFCDlg(CWnd* pParent /*=NULL*/) : CDialog(CTest1_MFCDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTest1_MFCDlg) // HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein //}}AFX_DATA_INIT // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTest1_MFCDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTest1_MFCDlg) // HINWEIS: Der Klassenassistent fügt an dieser Stelle DDX- und DDV-Aufrufe ein //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTest1_MFCDlg, CDialog) //{{AFX_MSG_MAP(CTest1_MFCDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTest1_MFCDlg Nachrichten-Handler BOOL CTest1_MFCDlg::OnInitDialog() { CDialog::OnInitDialog(); // Hinzufügen des Menübefehls "Info..." zum Systemmenü. // IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen void handle_avatar_add (void); int argc; char *argv[]; int rc; /* Prüfe Eingabeaufforderung */ if (argc < 3) { printf ("Benutzung: %s Citizen ID & Priv-Passwort\n", argv[0]); exit (1); } /* Initialisiere Active Worlds API */ if (rc = aw_init (AW_BUILD)) { printf ("API konnte nicht gestartet werden (Grund: %d)\n", rc); exit (1); } /* Installiere handler für avatar_add event */ aw_event_set (AW_EVENT_AVATAR_ADD, handle_avatar_add); /* create bot */ if (rc = aw_create (0, 5674, 0)) { printf ("Kann Bot nicht starten (Grund: %d)\n", rc); exit (1); } /* bot in das Universum einloggen */ aw_int_set (AW_LOGIN_OWNER, atoi (argv[1])); aw_string_set (AW_LOGIN_PRIVILEGE_PASSWORD, argv[2]); aw_string_set (AW_LOGIN_APPLICATION, "Harlekin TEST #1"); aw_string_set (AW_LOGIN_NAME, "SecBot"); if (rc = aw_login ()) { printf ("Kann nicht einloggen (Grund: %d)\n", rc); exit (1); } /* bot in die Welt "Germ@n" einloggen */ if (rc = aw_enter ("Germ@n")) { printf ("Kann nicht die Welt betreten (Grund: %d)\n", rc); exit (1); } /* Standort des bots festlegen 5.63N 41.29E 0.00a 169 */ aw_int_set (AW_MY_X, -41290); /* ####W -####E */ aw_int_set (AW_MY_Y, 0000); /* höhe */ aw_int_set (AW_MY_Z, 5630); /* ####N -####S */ aw_int_set (AW_MY_YAW, 1690); /* Richtung */ aw_int_set (AW_AVATAR_TYPE, 1); /* Avartar Typ */ if (rc = aw_state_change ()) { printf ("Kann Status nicht ändern (Grund: %d)\n", rc); exit (1); } /* Haupttätigkeit Schleife */ while (!aw_wait (-1)); /* Alles schließen */ aw_destroy (); aw_term (); return 0; } void handle_avatar_add (void) { char message[100]; sprintf (message, "Willkommen %s! Harlekin ist derzeit nicht da.", aw_string (AW_AVATAR_NAME)); aw_whisper (aw_int (AW_AVATAR_SESSION), message); sprintf (message, "Hinterlasse doch eine Nachricht am Terminal rechts von mir :)", aw_string (AW_AVATAR_NAME)); aw_whisper (aw_int (AW_AVATAR_SESSION), message); /* log the event to the console */ printf ("avatar_add: %s\n", aw_string (AW_AVATAR_NAME)); /* printf ("%s has session number %d\n", aw_string (AW_AVATAR_NAME), aw_int (AW_AVATAR_SESSION)); */ } return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten void CTest1_MFCDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie // den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das // Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt. void CTest1_MFCDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext für Zeichnen SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Symbol in Client-Rechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer // das zum Symbol verkleinerte Fenster mit der Maus zieht. HCURSOR CTest1_MFCDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; }
-
Hello again!
Also das Problem mit dem argv[](Kommandozeilenparameter) laesst sich mit den Infos aus dem Artikel hier ganz gut loesen denke ich.
Musst die Anwendung halt ein bisschen umbauen.http://www.c-plusplus.net/forum/viewtopic.php?t=67400&highlight=parsecommandline
Ansosonsten doch erstmal net schlecht.
Waere auch sinnvoll die Optionen fuer den Bot und so dann eben nicht mehr als Parameter zu uebergeben, sondern aus dem Dialogfeld heraus die Parameter einstellbar zu machen (ne GUI eben). Da haste dann auch deine MFC Erfahrung zum sammeln -g-
Bis denne
Harald