Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   GetProcAddres mit c++ ?! (https://www.delphipraxis.net/55920-getprocaddres-mit-c.html)

sniper_w 28. Okt 2005 21:27


GetProcAddres mit c++ ?!
 
soda, wenn ein C compiler das sieht:
Code:
#include <windows.h>

void (WINAPI * glMyBegin)( void );

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int
nFunsterStil)
{
   HINSTANCE myDll = NULL;
   myDll = LoadLibrary( "OpenGl32.dll");

   if (!myDll)
      return 0;

   glMyBegin = NULL;

   glMyBegin = GetProcAddress( myDll, "glBegin" );

   if (glMyBegin == NULL) // oder (!glMyBegin)
      MessageBox(NULL, "Failed to load function.","Error", 0);
   else
      MessageBox(NULL, "Function loaded.","Ok", 0);

   FreeLibrary( myDll );

   return 0;
}
dann ist alles so wie es sein sollte....es wird kompiliert.

Ein C++ compiler sagt dazu aber :
Zitat:

error C2440: '=' : cannot convert from 'int (__stdcall *)(void)' to 'void (__stdcall *)(void)'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
Was soll ich machen ? :gruebel:

EDIT:
Dabei ist folgende Zeile gemeint :
Code:
glMyBegin = GetProcAddress( myDll, "glBegin" );

c113plpbr 28. Okt 2005 21:42

Re: GetProcAddres mit c++ ?!
 
Probiers mal mit nem cast nach void:
Code:
glMyBegin = (void) GetProcAddress( myDll, "glBegin" );
ciao, Philipp

Flocke 28. Okt 2005 21:47

Re: GetProcAddres mit c++ ?!
 
Ein cast nach void ist ziemlich sinnlos (*).

GetProcAddress gibt einen allgemeinen Funktionstypen zurück, den du auf den entsprechenden Typen casten musst, also z.B.

Code:
glMyBegin = (void (WINAPI *)( void )) GetProcAddress( myDll, "glBegin" );
Wobei das "void (WINAPI *)( void )" genau der Definition von "glMyBegin" entspricht.

//Nachtrag:
(*) ein cast nach "(void *)" hätte klappen können.

sniper_w 28. Okt 2005 22:04

Re: GetProcAddres mit c++ ?!
 
@c113plpbr: So geht das leider nicht.

@Flocke: Leider hast du recht -> (void (WINAPI *)( void )) :roll:
Ich habe es schon so gelöst, habe aber gehoft dass es einfacher geht...
Code:
typedef void (WINAPI * glBegin_t)( void );
//..
glMyBegin = (glBegin_t)GetProcAddress( myDll, "glBegin" );
(void*) geht nicht, in C schon aber damit bekommt man lediglich eine Warnung weniger.

Flocke 28. Okt 2005 23:03

Re: GetProcAddres mit c++ ?!
 
Zitat:

Zitat von sniper_w
Ich habe es schon so gelöst, habe aber gehoft dass es einfacher geht...
Code:
typedef void (WINAPI * glBegin_t)( void );
//..
glMyBegin = (glBegin_t)GetProcAddress( myDll, "glBegin" );

Ich find's nicht unbedingt "unelegant", kannst ja mit dem Typedef dann auch die Variable "glMyBegin" deklarieren:
Code:
glBegin_t glMyBegin;

sniper_w 28. Okt 2005 23:12

Re: GetProcAddres mit c++ ?!
 
Ich habe es schon so gemach, nur nicht gepostet... ;)

Ich habe das Problem in zwischen gelöst.
Alle GetProcAdress Aufrufe sind in einer *.c Datei, im entsprechenen Header habe ich folgendes:

Code:
#ifdef __cplusplus
extern "C" {
#endif

// Deklarationen


#ifdef __cplusplus
}
#endif


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz