home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / OS2 / EMXFIX04.ZIP / C16TEST2.C < prev    next >
C/C++ Source or Header  |  1994-01-23  |  1KB  |  52 lines

  1. /* c16test2.c (emx+gcc) */
  2.  
  3. /* Call 16-bit function linked at run time. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #define INCL_DOSMODULEMGR
  8. #include <os2.h>
  9.  
  10. static _far16ptr add_addr = 0;
  11.  
  12. short add (int x, int y)
  13. {
  14.   return ((short)(_THUNK_C_PROLOG (2+2);
  15.                   _THUNK_C_SHORT (x);
  16.                   _THUNK_C_SHORT (y);
  17.                   _THUNK_C_CALLI (add_addr)));
  18. }
  19.  
  20.  
  21. /* Load c16.dll and get the address of add(). */
  22.  
  23. static void link_add (void)
  24. {
  25.   CHAR buf[32];
  26.   PFN pfn;
  27.   ULONG rc;
  28.   HMODULE hmod;
  29.  
  30.   rc = DosLoadModule (buf, sizeof (buf), "c16", &hmod);
  31.   if (rc != 0)
  32.     {
  33.       fprintf (stderr, "DosLoadModule failed, rc=%lu\n", rc);
  34.       exit (2);
  35.     }
  36.   rc = DosQueryProcAddr (hmod, 0, "_ADD", &pfn);
  37.   if (rc != 0)
  38.     {
  39.       fprintf (stderr, "DosQueryProcAddr failed, rc=%lu\n", rc);
  40.       exit (2);
  41.     }
  42.   add_addr = _emx_32to16 (pfn);
  43. }
  44.  
  45.  
  46. int main (void)
  47. {
  48.   link_add ();
  49.   printf ("2+3=%d\n", add (2, 3));
  50.   return (0);
  51. }
  52.