S
Hallo,
ich glaub, mir sind einige Grundlagen verloren gegangen, da ich nicht einmal mehr mit Zeigern umgehen kann. Bin mittlerweile fast nur noch in der C# Welt zu Hause, aber hin und wieder braucht man dann doch wieder C++.
Hier mal die Hintergründe, was ich vor habe:
NVidia hat endlich eine API zur Verfügung gestellt. Es handelt es sich dabei nur um eine C++ Header-Datei und eine dazugehörige Lib. Ich wollte dazu einen Wrapper schreiben, damit man auf die API möglichst bequem von C# aus darauf zugreifen kann. Daher ist meine Entscheidung für den Wrapper eben auch auf C++/CLI gefallen.
Nun zu meinem Problem:
Im API-Header hab ich folgende Funktion:
NVAPI_INTERFACE NvAPI_EnumNvidiaDisplayHandle ( NvU32 thisEnum,
NvDisplayHandle * pNvDispHandle )
In meinem Wrapper hab ich die Funktion folgendermaßen deklariert:
static NvAPINet_Status NvAPINet_EnumNvidiaDisplayHandle( NvU32 thisEnum, NetNvDisplayHandle *pNvDispHandle );
Eigentlich ganz einfach. Das Problem ist aber der übergebene Zeiger.
Im Original ist das so etwas:
#define NV_DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
...
NV_DECLARE_HANDLE(NvDisplayHandle);
Umgesetzt hab ich das jetzt mal ganz einfach in folgendes Konstrukt, wobei ich mir nicht sicher bin, ob das so stimmt.
public struct NetNvDisplayHandle { int unused; };
Auf jeden Fall kann ich das ganze schon mal kompilieren. Jetzt hab ich nur das Problem, dass mein DisplayHandle ein anderer Datentyp ist als der original DisplayHandle (Original: NvDisplayHandle, Meiner: NetNvDisplayHandle)
Der Handler wird erst beim Aufruf der API-Funktion gesetzt.
So sieht der Quellcode aus:
NvAPINet_Status NvAPINet::NvAPINet_EnumNvidiaDisplayHandle( NvU32 thisEnum, NetNvDisplayHandle *pNvDispHandle)
{
NvDisplayHandle display[NVAPI_MAX_PHYSICAL_GPUS * 2] = {0};
NvAPI_Status status = NvAPI_EnumNvidiaDisplayHandle(thisEnum, &display[0]);
// hier muss pNvDispHandle irgendwie auf &display gesetzt werden
return (NvAPINet_Status) status;
}
Wie schaff ich es jetzt, dass die Adresse des zurückgegebenen Handlers und die Adresse des eigenen Handlers gleich gesetzt werden?
Ich hoffe, dass mir da irgendjemand das ein bisschen erklären kann. Ich muss zugeben, dass ich von C++ nicht mehr allzuviel Ahnung habe.
Danke schon mal