Toon posts:

[C++ builder] return CallWindowProc

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe is dit aan de praat te krijgen onder C++ Builder 3?
code:
1
return CallWindowProc(lpWndProcOld, hwnd, message, wParam, lParam);

Dit staat aan het eind van WndProc() en C++ Builder geeft de volgende error:

Cannot convert 'void *' to 'int (__stdcall *())'

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

je functie niet een int laten returnen?

Skill is when luck becomes a habit.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

dus CallWindowProc retourneert void * en je WndProc wilt int (__stdcall *()) retourneren

je kunt m natuurlijk casten naar int (__stdcall *()), maar ik vraag me af of het wel klopt dat jouw WndProc int (__stdcall *()) moet retourneren (moet dat niet LRESULT zijn?)

casten doe je gewoon zo:
code:
1
return (int (__stdcall *())) CallWindowProc (bla bla bla);

BTW, het type int (__stdcall *()) is een pointer naar een functie die int retourneert en geen parameters heeft. Die __stdcall staat voor de calling convention

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Op woensdag 09 januari 2002 16:13 schreef OiSyN het volgende:
dus CallWindowProc retourneert void * en je WndProc wilt int (__stdcall *()) retourneren

je kunt m natuurlijk casten naar int (__stdcall *()), maar ik vraag me af of het wel klopt dat jouw WndProc int (__stdcall *()) moet retourneren (moet dat niet LRESULT zijn?)

casten doe je gewoon zo:
code:
1
return (int (__stdcall *())) CallWindowProc (bla bla bla);
Het moet idd LRESULT zijn (LRESULT CALLBACK WndProc), maar C++ builder kan blijkbaar niet zo goed overweg met de Windows API. Daar komt nog eens bij dat ik nog vrij onervaren ben qua programmeren en het feest is kompleet ;(

Dat van dat typecasting ga ik zo proberen. Tnx voor de tip

Verwijderd

Topicstarter
code:
1
return (int (__stdcall *())) CallWindowProc(lpWndProcOld, hwnd, message, wParam, lParam);

Hmmmz, dat geeft weer een paar leuke foutmeldingen erbij.
code:
1
2
3
4
5
6
[C++Error] Illegal character ' ' (0xa0).
[C++Error] Illegal character ' ' (0xa0).
[C++Error] Conflicting type modifiers.
[C++Error] Cannot convert 'void *' to 'int (__stdcall *)()'.
[C++Error] Type mismatch in parameter 'lpPrevWndFunc' in call to '__stdcall CallWindowProcA(int (__stdcall *)(),void *,unsigned int,unsigned int,long)'.
[C++Error] Cannot cast from 'long' to 'int *()'.

En dat allemaal in die ene regel !

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

ow wacht, dan zit het probleem ergens anders, namelijk bij de eerste parameter

die verwacht int (__stdcall *D() terwijl je een void * geeft

dus je moet lpWndProcOld even casten naar int (__stdcall *D() :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
'k zie trouwens net dat meerdere Windows API 'gevallen' ongeveer dezelfde meldingen geven...
code:
1
2
3
4
5
6
7
8
9
DialogBox(plugin.hDllInstance, MAKEINTRESOURCE(IDD_DIALOG), plugin.hwndParent, ConfigProc);

geeft

Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()'.

en

Type mismatch in parameter 'lpDialogFunc' in call to '__stdcall DialogBoxParamA(void *,const char *,void *,int (__stdcall *)(),long)'.


code:
1
2
3
4
5
6
7
8
9
return CallWindowProc(lpWndProcOld, hwnd, message, wParam, lParam);

geeft

Cannot convert 'void *' to 'int (__stdcall *)()'

en

Type mismatch in parameter 'lpPrevWndFunc' in call to '__stdcall CallWindowProcA(int (__stdcall *)(),void *,unsigned int,unsigned int,long)'.


code:
1
2
3
4
5
6
7
8
9
SetWindowLong(plugin.hwndParent, GWL_WNDPROC, WndProc);

geeft

Cannot convert 'long (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'long'.

en

Type mismatch in parameter 'dwNewLong' in call to '__stdcall SetWindowLongA(void *,int,long)'.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op woensdag 09 januari 2002 15:46 schreef Zotty het volgende:
Hoe is dit aan de praat te krijgen onder C++ Builder 3?
code:
1
return CallWindowProc(lpWndProcOld, hwnd, message, wParam, lParam);

Dit staat aan het eind van WndProc() en C++ Builder geeft de volgende error:

Cannot convert 'void *' to 'int (__stdcall *())'
Ik vraag me af of je weet wat dit betekent?

Ergens is er een void* die geconverteerd moet worden van void* naar int (*()). Dat zou het return type kunnen zijn
van CallWindowProc, maar dat denk ik niet. Ik vermoed dat de (void*) je variabele lpWndProcOld is. Het eerste argument van CallWindowProc is namelijk een int(*()).

Casten is niet de goede oplossing denk ik. Hoe kom je aan lpWndProcOld? Gaf die interface je ook al een void*? Of had je daar een int(*())? Het probleem met casten is dat het problemen verbergt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op woensdag 09 januari 2002 16:13 schreef OiSyN het volgende:
dus CallWindowProc retourneert void * en je WndProc wilt int (__stdcall *()) retourneren
Waar haal je dat vandaan? Er zijn ongeveer 7 expressies die een conversie noodzakelijk kunnen maken, en die van return type [van CallWindowProc] naar argument voor return statement[van WndProc] is er maar een van. De Win32 API heeft daarvoor heel andere types. Argument een van CallWindowProc daarentegen...

PS. andere 6 zijn de 5 argumenten van CallWindowProc, en de naam 'CallWindowProc'zelf >:)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Na enig zoekwerk is 1 ding duidelijk geworden; C++ Builder is gewoon niet geschikt om apps (een DLL in dit geval) voor de voor de windows API te maken :( 'k ga het nu proberen met VCL wat standaard bij C++ Builder zit, en hopelijk werkt dat beter...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 09 januari 2002 18:00 schreef MSalters het volgende:

[..]

Waar haal je dat vandaan? Er zijn ongeveer 7 expressies die een conversie noodzakelijk kunnen maken, en die van return type [van CallWindowProc] naar argument voor return statement[van WndProc] is er maar een van. De Win32 API heeft daarvoor heel andere types. Argument een van CallWindowProc daarentegen...
als je verder gekeken had dan had je gezien dat ik mezelf al verbeterd had :z

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1