GLBasic forum

Other languages => GLBasic - de => Topic started by: Schranz0r on 2007-Jun-29

Title: Inline , C++ und Header-Dateien....?
Post by: Schranz0r on 2007-Jun-29
Hi an alle



Gibt es den die möglichkeit Header-Datein in GLBasic ein zu binden?
Wenn ja, wie?
Und muss man den Namespace Beenden oder What :D ?

Kleines Biespiel wär Subba =)
Title: Inline , C++ und Header-Dateien....?
Post by: trucidare on 2007-Jun-30
Ich möchte auch noch mal:

Nach dem ich nun erfolgreich die Lib´s gelinkt habe kommt das problem mit den includes:

hier erstmal mein code

Code (glbasic) Select
INLINE
}

#include
#include

namespace __GLBASIC__ {
ENDINLINE
ok kompilieren und linken ohne fehler. nun will ich sdl und sdl_net initialisieren:
Code (glbasic) Select
INLINE
}

#include
#include

                SDL_Init(1);
SDLNet_Init();


namespace __GLBASIC__ {
ENDINLINE
hier gibts dann die fehler:

QuoteC:/DOKUME~1/DIVINE~1/LOKALE~1/Temp/glbasic/gpc_temp1.cpp:15: error: expected constructor, destructor, or type conversion before '(' token
C:/DOKUME~1/DIVINE~1/LOKALE~1/Temp/glbasic/gpc_temp1.cpp:15: error: expected `,' or `;' before '(' token
C:/DOKUME~1/DIVINE~1/LOKALE~1/Temp/glbasic/gpc_temp1.cpp:16: error: expected constructor, destructor, or type conversion before ';' token
habt ihr einen Vorschlag wie ich das lösen kann?
Title: Inline , C++ und Header-Dateien....?
Post by: Kitty Hello on 2007-Jul-02
Du kannst keine Funktionen aufrufen ausserhalb von einer Funktion. Also entweder das SDL_Init in "FUNCTION foo:" packen, oder in eine C Funktion:
void foo() {... }

Wenn man GLBasic Dateien einpacken will, einfach in's Projekt übernehmen und fertig.
Title: Inline , C++ und Header-Dateien....?
Post by: Quentin on 2007-Jul-02
ok ok ich weiß, man soll die Finger von INLINE lassen, wenn man nicht wirklich Ahnung von C++ hat. Trotzdem! ;)
Habe jetzt den ganzen Abend an folgenden Problem rumgefummelt. Geht darum, die Funktion EnumDisplaySettings aus user32.dll anzusprechen. Kompiliert wird das Teil auch einwandfrei, nur schmiert es gleich nach dem Start ab.

Wenn man den Zeiger auf die Funktion definiert (außerhalb jeglicher Funktion), wie definiert man dort einen Zeiger auf einer Struktur??

Quellen, wo ich schon mal rumgesucht habe:
http://msdn2.microsoft.com/en-us/library/ms533265.aspx
http://www.microsoft.com/germany/msdn/library/visualtools/vb6/BildschirmeinstellungenErmittelnUndAendern.mspx?mfr=true

Code (glbasic) Select
DllInit()
EnumDisplaySettings("", 1)

FUNCTION WeNeedOne:
ENDFUNCTION

// In __GLBASIC__ namespace, outside of functions make a pointer to a function
// im __GLBASIC__ namespace, ausserhalb von Funktionen einen Zeiger auf eine Funktion machen
INLINE
//int (__stdcall *WinMessy)(void*, const char*, const char*, int)=0L;
int (__stdcall *GetResolution)(const char*, long, void*)=0L;
ENDINLINE


// Load DLL and get Pointer to function
// DLL laden und Zeiger auf Funktion holen
FUNCTION DllInit:
INLINE
// DLLCALL(dll_name, fkt_name, void** pFunktionInDll)
DLLCALL("user32.dll", "EnumDisplaySettings", (void**)&GetResolution);
ENDINLINE
ENDFUNCTION


FUNCTION EnumDisplaySettings: disp$, num

    LOCAL scrwidth, scrheight
   
INLINE
   struct DEVMODE {
      char dmDeviceName[32];
  int dmSpecVersion;
  int dmDriverVersion;
  int dmSize;
  int dmDriverExtra;
  long dmFields;
  int dmOrientation;
  int dmPaperSize;
  int dmPaperLength;
  int dmPaperWidth;
  int dmScale;
  int dmCopies;
  int dmDefaultSource;
  int dmPrintQuality;
  int dmColor;
  int dmDuplex;
  int dmYResolution;
  int dmTTOption;
  int dmCollate;
  char dmFormName[32];
  int dmUnusedPadding;
  long dmBitsPerPel;
  long dmPelsWidth;
  long dmPelsHeight;
  long dmDisplayFlags;
  long dmDisplayFrequency;
   };
   DEVMODE devmode;
   devmode.dmSize = sizeof(DEVMODE);
GetResolution(disp_Str.c_str(), num, &devmode);
scrwidth = devmode.dmPelsWidth;
scrheight = devmode.dmPelsHeight;
ENDINLINE

PRINT scrwidth, 0, 0
PRINT scrheight, 0, 20
SHOWSCREEN

ENDFUNCTION
Title: Inline , C++ und Header-Dateien....?
Post by: Kitty Hello on 2007-Jul-02
Fixed code:
Code (glbasic) Select
EnumDisplaySettings("", 0)

KEYWAIT



FUNCTION WeNeedOne:
ENDFUNCTION

// In __GLBASIC__ namespace, outside of functions make a pointer to a function
INLINE
// * NEU *
DECLARE_ALIAS( user32_EnumDisplaySettings, "user32.dll", \
"EnumDisplaySettingsA", (const char*, unsigned int, void*), \
int);
ENDINLINE

FUNCTION EnumDisplaySettings: disp$, num

    LOCAL scrwidth, scrheight
   
    INLINE
        struct DEVMODE {
              char dmDeviceName[32];
              short dmSpecVersion;
              short dmDriverVersion;
              short dmSize;
              short dmDriverExtra;
              long  dmFields;
              short dmOrientation;
              short dmPaperSize;
              short dmPaperLength;
              short dmPaperWidth;
              short dmScale;
              short dmCopies;
              short dmDefaultSource;
              short dmPrintQuality;
              short dmColor;
              short dmDuplex;
              short dmYResolution;
              short dmTTOption;
              short dmCollate;
              char dmFormName[32];
              short dmUnusedPadding;
              long dmBitsPerPel;
              long dmPelsWidth;
              long dmPelsHeight;
              long dmDisplayFlags;
              long dmDisplayFrequency;
        };
        DEVMODE devmode;

        devmode.dmSize = sizeof(DEVMODE);
        // * NEU *
        // if disp$ = "", pass NULL instead!
        user32_EnumDisplaySettings(LEN(disp_Str) ? disp_Str.c_str() : NULL, num, &devmode);
        scrwidth = devmode.dmPelsWidth;
        scrheight = devmode.dmPelsHeight;
    ENDINLINE
   
    PRINT scrwidth, 0, 0
    PRINT scrheight, 0, 20
    SHOWSCREEN
   
ENDFUNCTION
Title: Inline , C++ und Header-Dateien....?
Post by: Quentin on 2007-Jul-02
Genial, das funktioniert. Demnächst dann eine Funktion, die alle möglichen Auslösungen zurückliefert. Muss noch ein wenig in MSN wühlen. Hab da irgendwo gelesen, daß man nicht alle Funktionen nutzen kann, die zurückgeliefert werden.