Yes!!! У меня получилось.
Я передаю массив с адресами функций через основную кучу процесса.
Вот код DLL, в которой нет ни одной экспортируемой функции...
Код: Выделить всё
// HeapLib.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include <tchar.h>
BOOL PrintText(LPCTSTR szText)
{
static HANDLE hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE);
//
DWORD dw(0);
return ::WriteConsole(hConsole, szText, ::lstrlen(szText), &dw, NULL);
}
BOOL SayHello()
{
return PrintText(_T("Привет всем программерам!\r\n"));
}
BOOL SayGoodBye()
{
return PrintText(_T("Всем пока! :-)\r\n"));
}
class Global
{
public:
Global()
{
HANDLE hHeap = ::GetProcessHeap();
m_lpData = (LPBYTE)::HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 80);
if (m_lpData != NULL)
{
char Signature[] = "HEAP :D LL";
memcpy((LPSTR)m_lpData, Signature, sizeof(Signature));
FARPROC* lpFarProc = (FARPROC*)(m_lpData+16);
lpFarProc[0] = (FARPROC)SayHello;
lpFarProc[1] = (FARPROC)SayGoodBye;
}
}
~Global()
{
if (m_lpData != NULL)
{
HANDLE hHeap = ::GetProcessHeap();
::HeapFree(hHeap, 0, m_lpData);
}
}
private:
LPBYTE m_lpData;
} _global;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
return TRUE;
}
А вот код, который вызывает из неё функции...
Код: Выделить всё
#include "stdafx.h"
typedef BOOL (*SAYHELLO)(void);
typedef BOOL (*SAYGOODBYE)(void);
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE hModule = ::LoadLibrary(_T("HeapLib.dll"));
if (hModule != NULL)
{
FARPROC* lpFarProc(NULL);
HANDLE hHeap = ::GetProcessHeap();
PROCESS_HEAP_ENTRY phe = {NULL};
BOOL bNext = ::HeapWalk(hHeap, &phe);
while (bNext != FALSE)
{
bNext = ::HeapWalk(hHeap, &phe);
if (phe.cbOverhead > 0)
{
LPCSTR lps = (LPCSTR)phe.lpData;
if (strcmp(lps, "HEAP :D LL") != 0)
continue;
lpFarProc = (FARPROC*)((LPBYTE)phe.lpData+16);
break;
}
}
if (lpFarProc != NULL)
{
SAYHELLO fhSayHello = (SAYHELLO)lpFarProc[0];
SAYGOODBYE fhSayGoodBye = (SAYGOODBYE)lpFarProc[1];
// вызов полученных функций...
fhSayHello();
fhSayGoodBye();
}
//
::FreeLibrary(hModule);
}
getc(stdin);
return 0;
}
При выполнении программы на экране появляются строки:
Привет всем программерам!
Всем пока! :-)
WinMain, спасибо за прекрасную идею!