Me vi en la necesidad de tener que localizar los datos que exporta un archivo ejecutable en tiempo de ejecución, así que el mejor método es caminar por el formato PE y este es un ejemplo válido para todos los Windows NT:
//--------------------------------------------------------------------------- PIMAGE_EXPORT_DIRECTORY ImageExportDirectory(HMODULE hModule) { DWORD VirtualAddress_idata = ((DWORD)hModule + *(DWORD*)((DWORD)hModule + 0x3C) + 0x78); return PIMAGE_EXPORT_DIRECTORY((DWORD)hModule + *(DWORD*)VirtualAddress_idata); } //----------------------------------------------------------------------------- void __fastcall GetExportData(char* ModuleName, TMemo* Memo1) { Memo1->Clear(); HMODULE hModule = LoadLibrary(ModuleName); if(!hModule) hModule = GetModuleHandle(ModuleName); if(!hModule){ Memo1->Text = "Can't open module"; return; } PIMAGE_EXPORT_DIRECTORY IED = ImageExportDirectory(hModule); char* ModuleName = (char*)(IED->Name + (DWORD)hModule); char** Names = (char**)(IED->AddressOfNames + (DWORD)hModule); DWORD* EntryPoints = (DWORD*)(IED->AddressOfFunctions + (DWORD)hModule); WORD* Index = (WORD*)(IED->AddressOfNameOrdinals + (DWORD)hModule); // Listar las funciones exportadas: for(int n=0; n<IED->NumberOfNames; n++){ if(Index[n]>=IED->NumberOfFunctions) continue; char* Name = Names[n] + (DWORD)hModule; Memo1->Lines->Add("0x" + IntToHex((int)(EntryPoints[Index[n]] + (DWORD)hModule), 8) + ": " + String(Name)); Application->ProcessMessages(); } FreeLibrary(hModule); }
Saludos.