Handle an ein Programm übergeben

Crisu

Grünschnabel
Hallo,

ich versuche aus einer DLL-Funktion einen Handle zu einem String an ein Programm zu übergeben.
Ich habe da einiges über GlobalAlloc und GlobalFree usw. gelesen.

Der jetztige Quelltext sieht so aus:

#include <iostream.h>
#include <string.h>
#include <windows.h>

BOOL WINAPI DllEntryPoint(HINSTANCE hDLL, DWORD dwReason, LPVOID Reserved)
{
switch (dwReason) {
case DLL_PROCESS_ATTACH: {break;}
case DLL_PROCESS_DETACH: {break;}
}
return true;

}

DWORD __declspec(dllexport) __stdcall test()
{
char text[] = "Hallo!";
LPSTR ptr;
ptr = text;
LPSTR lpbuffer;
HANDLE hbuffer;
DWORD dwresult = (DWORD) MAKELONG (NULL, -1);
int sLength;

sLength = lstrlen(ptr);

hbuffer = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE, (DWORD) sLength +1);

if (hbuffer != 0)
{
lpbuffer = (LPSTR) GlobalLock(hbuffer);

if (!lpbuffer)
{
GlobalFree(hbuffer);
}
else
{
if (!lstrcpy(lpbuffer, ptr))
{
GlobalUnlock(hbuffer);
GlobalFree(hbuffer);
}
else
{
GlobalUnlock(hbuffer);
dwresult = (DWORD) MAKELONG (hbuffer, NULL);
}
}
}
return dwresult;
}

funktioniert leider nicht.

Der handle muß laut Programm als ein DWORD übergeben werden und im LOW-WORD steht dann der Handle und im HIGH-WORD der Fehlercode.

Vielen Danke nochmal
 
Definiere er "funktioniert nicht".

Stürzt ab?
Falscher Rückgabewert?
Die Maus fällt vom Schreibtisch?
 
Original geschrieben von Endurion
Definiere er "funktioniert nicht".
...
Die Maus fällt vom Schreibtisch?
LOL + *prust*!

@Crisu: Und bitte Codetags verwenden! Unformatierter Code macht blind!
 

Anhänge

  • _codetags.gif
    _codetags.gif
    7,5 KB · Aufrufe: 31
Habe grade das MAKELONG-Makro geprüft. Du hast da ein Problem:

Ein Handle oder Pointer ist zur Zeit 32-Bit gross. Ein DWORD auch. Du kannst da also nicht ZWEI 32-Bit-Werte in einem unterbringen. Gib entweder ein Struct zurück, oder besser, benutze Referenzen zur Übergabe. Du kannst natürlich auch nur das Handle zurückgeben, dafür reicht ein DWORD auch aus.

Übrigens, in Blick auf die Zukunft, verwende bei Rückgabewerten, die einen Pointer beinhalten sollen, DWORD_PTR statt DWORD. Dieses garantiert, dass bei einer späteren Kompilierung für 64-bit-Systeme der Rückgabewert gross genug für einen Pointer (ist dann ja 64bit) ist.
 

Neue Beiträge

Zurück