c ++ - Hvorfor GetProcAddress virker ikke?

Indlæg af Hanne Mølgaard Plasc

Problem



For det første opretter jeg en simpel dll kaldet SimpleDll.dll, dens hovedfil:


// SimpleDll.h
#ifdef MYLIBAPI
#else
#define MYLIBAPI \_\_declspec(dllimport)
#endif

MYLIBAPI int Add(int a. int b);


dens kildekode:


// SimpleDll.c
#include <windows.h>

#define MYLIBAPI \_\_declspec(dllexport)
#include "SimpleDll.h"    

int Add(int a, int b)
{
    return a + b;
}


Så kalder jeg det i et andet projekt, og det virker fint:


// TestSimpleDll.c
#include "stdafx.h"
#include <windows.h>
#include "SimpleDll.h"

#pragma comment(lib, "SimpleDll.lib")

int \_tmain(int argc, \_TCHAR* argv[])
{
    printf("\%d", Add(10, 30));    // Give the expected result 40
    return 0;
}


Men når jeg ringer til GetProcAddress for at få den til at komme til det, virker det ikke!


// TestSimpleDll2.c
#include "stdafx.h"
#include <windows.h>
#include "SimpleDll.h"

#pragma comment(lib, "SimpleDll.lib")

int \_tmain(int argc, \_TCHAR* argv[])
{
    printf("\%d", Add(10, 30));    // Give the expected result 40
    HMODULE hModule = GetModuleHandleA("SimpleDll.dll");    // hModule is found
    PROC add\_proc       = GetProcAddress(hModule, "Add");     // but Add is not found !
    //  add\_proc is NULL!
    return 0;
}


Tak for din hjælp. (PS: Jeg bruger VS2010 på Windows7)

Opdatering:

Dette er, hvad depencen walker viser for SimpleDll.dll filen:


Indtast billedbeskrivelse her

Bedste reference


Du skal bruge en .def-fil, hvis du vil eksportere navnet til GetProcAddress. Ellers bliver du nødt til at beskæftige sig med c ++ navn mangling og med symbol dekorationer. [10]


Du kan undgå mangling ved at erklære din funktion som extern "C", men den eneste måde at undgå dekorationer på er at bruge en .DEF-fil.


Endnu en ting - i Dependency Walker - brug F10 til at skifte mellem dekoreret og undecorated navne.

Andre referencer 1


Dependency Walker er et fremragende værktøj til fejlfinding af DLL-problemer som dette. [11]


Jeg antager, at du kompilerer DLL'en som C-kode. Ellers udfører C ++ navngivning, der ville medføre problemer.


For at undgå navn mangling skal du blot pakke eksportdefinitionen i ekstern 'C'.


extern "C" {
    MYLIBAPI int Add(int a. int b);
}