Nie widzę całego kodu funkcji, więc tylko domniemania. Kodu nie kompilowałem, więc wiesz...
ret_val =( AsKCTCmdCheck )( 0,( & message )[ 4092 ] );
Linijka, która uważasz, że wywala błąd.
4096 po raz pierwszy.
ret_val pobiera rezultat działania funkcji wywoływanej przez wskaźnik, funkcja ta pobiera dwa argumenty. Błąd jest w drugim parametrze: adres na 4091 bajt zmiennej message.
typedef long( __stdcall * pICFUNC )( long, char( & message )[ 4092 ] );
typedef long( __stdcall * pICFUNC )( long, char * )
Powinien być wskaźnik na tablicę char, wystarczy więc samo char* lub char[] (zobacz pierwszy parametr to sam typ long, bez nazwy zmiennej),
Idąc dalej, należy podać wskaźnik na funkcję, która ma się wykonać, funkcja musi mieć zgodne argumenty z deklaracją (long, char*). Dopiero przy wywoływaniu konkretnej funkcji przez wskaźnik należy podać argumenty, o który Ci chodzi, w tym właśnie message.
Wtedy przy wywołaniu już konkretnej funkcji, do przekazanej tablicy zostanie podstawiona jakaś konkretna, oczekiwana wartość. Wtedy i tylko wtedy - nie w typedef.
char * message = new char[ 4096 ];
FARPROC CmdCheck = GetProcAddress( HMODULE( hModule ), "AsKCTCmdCheck" );
pICFUNC AsKCTCmdCheck;
AsKCTCmdCheck = pICFUNC( CmdCheck );
ret_val =( AsKCTCmdCheck )( 0,( & message )[ 4096 ] );
ret_val =( AsKCTCmdCheck )( 0, message );
...
delete[] message;
Obszerne wyjaśnienie działania wskaźników na funkcje.
http://www.egrafik.pl/kurs-c-plus-plus/8.3.php//EDIT
Uproszczone wywoływanie funkcji przez wskaźnik:
#include <string.h>
#include <iostream>
using namespace std;
long test( char * C )
{
strcpy( C, "01234567890" );
}
int main()
{
char message_1[ 4096 ];
char * message_2 = new char[ 4096 ];
typedef long( * fun_ptr )( long, char * );
fun_ptr test_1 =( fun_ptr ) test( & message_1[ 0 ] ),
test_2 =( fun_ptr ) test( message_2 );
cout << "\nTest 1: " << message_1
<< "\nTest 2: " << message_2;
delete[] message_2;
cin.ignore();
return 0;
}