Toon posts:

[C++] dll's gebruiken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een opdracht waarbij het nodig is dat ik vanuit een C++ programma functies uit een dll kan aanroepen. Ik ben er al achter dat dit met LoadLibrary en GetProcAddress moet gebeuren maar ik kan nergens ook maar iets vinden dat duidelijk uitlegt hoe ik die twee methodes precies moet gebruiken. en dan met name GetProcAddress. Mijn vraag is dan ook of iemand een duidelijk voorbeeld, of nog beter een goede uitleg heeft over hoe dit werkt.
Alvast bedankt,
TriLight.

  • hufkes
  • Registratie: Maart 2000
  • Laatst online: 26-08 18:43

hufkes

nee, daar staat niet hufter!

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_GetProcAddress.asp

[mod mode]
Dat groeten onder de post liever niet doen, lees ook eens de FAQ
[/mod mode]

Onderstaande signature is al >20jr oud ***hoe dan***
---
Het internet is een veelbelovend medium
....dat maar heel weinig van zijn beloftes nakomt.
Wat weg is... raak je nooit meer kwijt :P


Verwijderd

Topicstarter
okee, met dank aan de info achter die link is het gelukt om alles te laten werken, alleen geeft het programma nog 2 pagina fout errors en een kernel uitzondering error tijdens/na het werken. ook gaf de compiler een warning dat de stijl ouderwets zou zijn, en dat 'functie' geen prototype zou hebben. Er is dus nog iets verkeerd met de code maar ik weet niet wat het is.
dit is de code van het programma:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <windows.h>    //voor LoadLibrary en GetProcAddress

typedef void (*func)(JNIEnv, jobject);

int main(void) 
{
    HINSTANCE hint = NULL;  //handle voor DLL
    func functie;   //functie pointer

    hint = LoadLibrary("hello.dll");
    if(hint!=NULL) 
    {
        functie = (func) GetProcAddress(hint, "Java_HelloWorld_displayHelloWorld");
        if(!functie) 
        {
            FreeLibrary(hint);
            return -1;
        }
        else
        {
            functie(NULL, NULL);
        }
    }
    FreeLibrary(hint);
    return 0;
}

en dit is de code van hello.dll:
code:
1
2
3
4
5
6
7
8
9
10
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL 
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 
{
    printf("Hello world!\n");
    return;
}

(Het is inderdaad een vrij nutteloos programma, maar als ik dit kan laten werken, dan lukt het met het echte programma ook wel. (hoop ik))

  • hufkes
  • Registratie: Maart 2000
  • Laatst online: 26-08 18:43

hufkes

nee, daar staat niet hufter!

Processes explicitly linking to a DLL call GetProcAddress to obtain the address of an exported function in the DLL. You use the returned function pointer to call the DLL function. GetProcAddress takes as parameters the DLL module handle (returned by either LoadLibrary, AfxLoadLibrary, or GetModuleHandle), and either the name of the function you want to call or the function's export ordinal.

Because you are calling the DLL function through a pointer and there is no compile-time type checking, make sure that the parameters to the function are correct so that you do not overstep the memory allocated on the stack and cause an access violation. One way to ensure type safety is to look at the function prototypes of the exported functions and create matching typedefs for the function pointers. For example:
Ben bang dat je dus toch een verkeerde aanroep doet waardoor je die pagefaults krijgt. Heb hier geen VCC bij dehand, dus kan het niet checken, sorry.

Die functie fout moet je denk ik in die typedef zoeken, je wilt wel een return, maar je definitie zegt void. Bovendien moet je denk ik ook #include <jni.h> erbij zetten om (JNIEnv, jobject); te kunnen gebruiken.

[stijl opmerking]
Verder zou ik het dus absoluut geen "hint" noemen, de h (kleine letter staat voor Handle, en de rest van de naam voor het soort object waar die handle naar verwijst, dus in dit geval lijkt het een handle naar een int.
[/stijl opmerking]

Onderstaande signature is al >20jr oud ***hoe dan***
---
Het internet is een veelbelovend medium
....dat maar heel weinig van zijn beloftes nakomt.
Wat weg is... raak je nooit meer kwijt :P


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 19:01
Waar gaat 'ie in de fout?
Bij de aanroep van je zojuist geladen functie of al eerder?
Of _in_ je geladen functie?

Dat jobject, wat is dat? Is dat wel een 32 bits variable? Anders klopt je tweede NULL namelijk niet.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:38
In je typedef voor de functie pointer ben je een '*' vergeten voor env ?

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
Bedankt voor de hulp, het is niet gelukt om deze code nog werkend te krijgen, het lag in ieder geval waarschijnlijk wel aan jobject en JNIEnv. Het is me uiteindelijk wel gelukt om een iets eenvoudiger versie aan de praat te krijgen zonder errors.
:) Nu kan ik in ieder geval weer verder komen met de oorspronkelijke opdracht.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

doe die typedef eens zo:
code:
1
typedef void (JNICALL * func)(JNIEnv *, jobject);

er is dus JNICALL bij gezet, en ook een pointer naar een JNIEnv object als 1e parameter

Je functie in je dll verwacht namelijk wel een pointer naar JNIEnv, maar je typedef'de m als niet-pointer. Maar de fout zit m denk ik in die JNICALL, dat is namelijk een calling convention (de manier waarop argumenten op de stack worden gezet, en of de functie de stack zelf weer opruimt of dat de functie die m aanroept dat moet doen). Waarschijnlijk is JNICALL geen __cdecl, wat de default C calling convention is, waardoor de boel dus verkeerd gaat

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

Waarom gebruik je geen static linking? een .h includen, een .lib linken en klaar ben je. Dat loadlibrary verhaal is leuk, maar erg naar op een gegeven moment, zeker als je zelf de functionpointers moet definieren :)

Verwijderd

Topicstarter
okee, met die JNICALL werkt het inderdaad beter. :) Dat scheelt weer, want ik had ondertussen hetzelfde probleem weer met een andere testfunctie.

En waarom geen static linking? omdat er geen .h en .lib files bij zitten, het is gewoon een commercieel programma. Ik heb alleen een .dll en de specificatie.

Iedereen bedankt voor de hulp. :)
Pagina: 1