Another slight issue I’ve found with the SLiRP code, is that it expects to be able to call two functions (slirp_can_output and slirp_output). The snag here is that DLL’s expect to be SELF CONTAINED… So how can you have a DLL that needs to call functions from your program?
Void pointers!
So let’s make this more… involved.
dll.c
void (*bob)(int xy);
__declspec(dllexport) int hi(void)
{
(*bob)(12);
return 3;
}__declspec(dllexport) void Register(void *p)
{
bob=p;
}
test.c
extern void Register(void *p);
void XX(int xy)
{
printf(“XX %d\n”,xy);
}void main(void)
{
int j;
Register(XX);
j=hi();printf(“%d\n”,j);
}
And let’s build it…
c:\temp\dll>cl /c /LD dll.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80×86
Copyright (C) Microsoft Corporation. All rights reserved.dll.c
c:\temp\dll>link /DLL dll.obj
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.Creating library dll.lib and object dll.exp
c:\temp\dll>cl test.c dll.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80×86
Copyright (C) Microsoft Corporation. All rights reserved.test.c
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved./out:test.exe
test.obj
dll.libc:\temp\dll>test
XX 12
3
So as we can see, the main procedure runs the ‘register’ procedure to tell the dll that the ‘bob’ procedure will infact be XX. Now when the dll invokes it’s ‘hi’ function it can call the XX function from the exe. Now if I were a better programer, I’d use the DLLMain code to make sure that all my virtual void functions cause some kind of ‘readable’ panic message when called so you don’t get the default reaper… Because naturally if you run the dll code without the register function it’ll crash in a not so great manner.
But I’ll leave that as an exercise to the reader.
I’ve made some good progress on the SIMH thing, Ive got the non networked versions & the libpcap stuff building with Visual C++ 2008… I was thinking about using that 2010 RC but that just seems wrong…. But for now all I’ll have to do is apply this logic to the slirp dll, and get building the VC version for linking, and the Mingw version for actual operation….
Much to my amazement, SIMH's microvax II is now running! The main core built with Visual C++ 2008, and SLiRP built with GCC. It feels FAST.
I'll have to update later, but first let me backup my code…!