For a long time I remember how people talked about how this was impossible, then I remembered one day something about how they finally figured it out... so I did some searching and it turns out current editions of VisualBoyAdvance do just that!
All you have to do is uncheck the Emulator--->pause when focus lost (or whoever it says) and start two copies... set the joypad input for player 1 differently for each one and go from there!
I fired up a 2 player game of Double Dragon Advance on my home PC (nice to finally be able to play 2 player on a single computer!), and did the same with Final Fight One (though if you have the arcade version, there isn't much point in playing this one, as it has the annoying music and censorship).
The only trouble is I tried to record a movie of it and it is a real pain in the butt to do so... you have to create a saved game and load both from the same saved game, and record the movie (of the input) then record the AVI of it, but it desynchs very easily.
Still, this puts me one step closer to realizing my dream of playing DDA with two players on a regular size TV (rather than having to buy a second copy of the cartridge and a gameboy player and gamecube, in addition to a gba!)!
Since VBA supports regular gameboy, super gameboy and gameboy color, that covers the old school nintendo portables. Now they just need to do the same for the Game Gear and Atari Lynx (and probably the Neo Geo pocket/color as well since I assume it also had a link cable), and we're set!
I wonder if a similar technique of running two instances of the emulator could be utilized for other link using consoles and arcade games? (granted, that's twice the stress on every pc running the games but still).
There is a LAN and wi fi compatible mode as well for VisualBoyAdvance, so it's not just for playing on a single PC.