Avatar billede spectual Nybegynder
23. oktober 2002 - 13:59 Der er 14 kommentarer og
2 løsninger

Instance Handle

Davs.

Hvorledes får jeg fat i mit instance handle (HINSTANCE) inde i min DLL fil?

Jeg har ikke mulighed for at få den fra min DLL main, da den funktion i denne samhæng ikke bliver kørt.
Avatar billede jpk Nybegynder
23. oktober 2002 - 14:11 #1
Prøv at kigge på GetModuleHandle eller AfxGetInstanceHandle...
Avatar billede spectual Nybegynder
23. oktober 2002 - 14:15 #2
hvor er AfxGetInstanceHandle defineret?
Avatar billede spectual Nybegynder
23. oktober 2002 - 14:18 #3
ok.. det er så ligegyldigt for den hører til MFC - som jeg ikke bruger.
Avatar billede soepro Nybegynder
23. oktober 2002 - 14:37 #4
DLL main bliver ikke kørt ??? Det gør den da i fbm. LoadLibrary ! Hvis du laver en lokal HINSTANCE variabel i din DLL til at gemme den i, kan du da få værdien i alle andre DLL funktioner også:

#include <windows.h>
#pragma hdrstop

#pragma argsused
HINSTANCE myPID;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
  myPID = hinst;
  return 1;
}

double dblValue(double);
double halfValue(double);
extern "C" __declspec(dllexport) double changeValue(double, bool);

double dblValue(double value)
{
  return 2* value;
}

double halfValue(double value)
{
  if (myPID % 2 == 0)
    return value / 2.0;
  else
    return 0;
}

double changeValue(double value, bool UpValue)
{
  return UpValue ? dblValue(value) : halfValue(value);
}
Avatar billede spectual Nybegynder
23. oktober 2002 - 14:41 #5
I kan se koden som fejler her:

void Prepare_Resources ( ) {

    char buf [100];

    HINSTANCE hInstance = GetModuleHandle (NULL);

    connected = (HBITMAP) LoadImage(hInstance,
        MAKEINTRESOURCE (IDB_Connected),
        IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_DEFAULTCOLOR);

    DWORD err = GetLastError ();

    sprintf ( (char*)&buf, "%d", err );
    if (err)
        MessageBox ( NULL, buf, "fejl", 0);

    if (connected == NULL)
        MessageBox ( NULL, "Billede blev ikke indlaest ", "Shit", 0);
    else MessageBox ( NULL, "ok billede", "yes", 0);

};
Avatar billede spectual Nybegynder
23. oktober 2002 - 14:42 #6
Jeg får en fejl 1814 på GetLastError.
Avatar billede spectual Nybegynder
23. oktober 2002 - 14:43 #7
.. som i følge http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp betyder:

ERROR_RESOURCE_NAME_NOT_FOUND :

The specified resource name cannot be found in the image file.
Avatar billede soepro Nybegynder
23. oktober 2002 - 14:52 #8
Spectual >> Hvorfor ikke gemme handlen når DLL'en bliver aktiveret ?
Avatar billede spectual Nybegynder
23. oktober 2002 - 14:54 #9
soepro >> fordi DLLMain ikke bliver kørt :O)
Avatar billede spectual Nybegynder
23. oktober 2002 - 15:13 #10
hm.. her har vi tilsyneladende mit problem:

I had a similar problem when I tried to create windows from console
applications. I used the GetModuleHandle() function to do this and it
worked OK. Simply pass NULL as a parameter, and cast the result to
HINSTANCE.

Beware when using this inside a DLL!!! In this case GetModuleHandle(NULL)
will return the handle to the instance of the running aplication and not
the one of the DLL.  Sometimes this is not what you want, especially if
your resources are inside the DLL. In this case it's best if you stash the
HINSTANCE from DllMain(). You could try passing the name of the DLL as a
parameter to GetModuleHandle(). I did not try this, but it should work.

                                Emil
Avatar billede soepro Nybegynder
23. oktober 2002 - 15:14 #11
spectual >> Hvis jeg kører ovenstående eksempel, bliver DLLEntryPoint kørt ! Du må da have en WINAPI funktion i din DLL ?!?!
Avatar billede soepro Nybegynder
23. oktober 2002 - 15:15 #12
spectual >> '.. it's best if you stash the HINSTANCE from DLLMain ...' som jeg skrev.
Avatar billede spectual Nybegynder
23. oktober 2002 - 15:16 #13
Er det "WINAPI" der afgører start funktion for en DLL?

Anyway - det er en lidt speciel dll det her, fordi den bruges som et plugin til winamp. Det er meget muligt at programmøren af winamp har lavet et eller gejl.
Avatar billede spectual Nybegynder
23. oktober 2002 - 15:17 #14
kan ikke, soepro - ellers havde jeg gjort det for længst.
Avatar billede spectual Nybegynder
23. oktober 2002 - 16:00 #15
Nå. Så virker det.

Problemet var som "Emil" beskrev - jeg fik det forkerte instance handle og dermed kunne den ikke finde resourcen.

Derimod, hvis man kaldte GetModuleHandle med navnet på dll'en som parameter, returnerer den det rigtige handle, og alt virker som det skal.

jpk - hvis du vil ha lidt points må du komme med et svar.
Avatar billede jpk Nybegynder
23. oktober 2002 - 16:36 #16
Jamen så siger jeg da tak på forhånd...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester