* * *

Author Topic: Message "... missing output KERNEL32.DLL...  (Read 3075 times)

BlaiseP

  • New member
  • *
  • Posts: 8
Message "... missing output KERNEL32.DLL...
« on: October 28, 2016, 12:03:28 pm »
I have just downloaded and installed Lazarus 1.4.0/FPC 2.6.4 from http://michael-ep3.physik.uni-halle.de/Lazarus/releases/Lazarus_Windows_32_bits/Lazarus_1.4/ on an old Windows ME machine, that went OK, but if I click the Lazarus desktop icon I immediately get the messages
"Error starting the program
The file LAZARUS.EXE is linked to missing output KERNEL32.DLL:Process32FirstW.
"
and
"A device connected to the system does not work"
and the Lazarus IDE does not start.

What is wrong here?
« Last Edit: October 28, 2016, 12:40:28 pm by BlaiseP »

GetMem

  • Hero Member
  • *****
  • Posts: 2251
Re: Message "... missing output KERNEL32.DLL...
« Reply #1 on: October 28, 2016, 12:10:40 pm »
Hi BlaiseP,

It means that lazarus try to use a function(Process32FirstW) from kernel32.dll that is not available in windows ME. See the microsoft documentation(minimum supported client):
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834(v=vs.85).aspx

BlaiseP

  • New member
  • *
  • Posts: 8
Re: Message "... missing output KERNEL32.DLL...
« Reply #2 on: October 28, 2016, 12:55:04 pm »
Thanks for your quick answer.

What can I do about that error -  copy a kernel32.dll file form a later version, say Windows XP?

Thaddy

  • Hero Member
  • *****
  • Posts: 4439
Re: Message "... missing output KERNEL32.DLL...
« Reply #3 on: October 28, 2016, 12:56:17 pm »
Note that win ME is no longer supported anyway. You must use an older (than 2.6.4) version for the fpc part to work.
2.6.4. is known to work in some cases, but that was by accident. Only NT based (even bottomline XP and higher) windows versions are officially supported.

You can download older distributions, however, that will work from the branches in svn. A 2.6.0 or 2.6.2 bootstrap compiler would work.
https://sourceforge.net/projects/freepascal/files/Win32/
"Logically, no number of positive outcomes at the level of experimental testing can confirm a scientific theory, but a single counterexample is logically decisive."

Thaddy

  • Hero Member
  • *****
  • Posts: 4439
Re: Message "... missing output KERNEL32.DLL...
« Reply #4 on: October 28, 2016, 12:58:08 pm »
Thanks for your quick answer.

What can I do about that error -  copy a kernel32.dll file form a later version, say Windows XP?

No you must use an older version of FPC. Copying kernel32 from an NT family to a win95 family windows won't work, can even make your computer unusable.

And that goes probably for Lazarus as well, last known to work was 0.9.x version
« Last Edit: October 28, 2016, 01:00:41 pm by Thaddy »
"Logically, no number of positive outcomes at the level of experimental testing can confirm a scientific theory, but a single counterexample is logically decisive."

GetMem

  • Hero Member
  • *****
  • Posts: 2251
Re: Message "... missing output KERNEL32.DLL...
« Reply #5 on: October 28, 2016, 02:13:25 pm »
Search Lazarus source with a text crawler. Comment out "Process32FirstW" and "Process32NextW" then rebuild lazarus with a bat file like this:
Code: Pascal  [Select]
  1. SET PATH=C:\FPC\2.6.4\bin\i386-win32\
  2. make bigide
  3. pause

BlaiseP

  • New member
  • *
  • Posts: 8
Re: Message "... missing output KERNEL32.DLL...
« Reply #6 on: October 28, 2016, 07:06:19 pm »
Quote from: Thaddy
Note that win ME is no longer supported anyway.
I know, but I need a Windows version that allows direct I/O port access and that would be 95, 98 or ME, later versions do not allow that.
Quote
... You can download older distributions, however, that will work from the branches in svn.  A 2.6.0 or 2.6.2 bootstrap compiler would work.
What is svn?
I downloaded 2.6.2 and on click that complained "This program does not support the version of Windows your computer is running".
Thenn I tried 2.6.0: installed OK, also the included IDE runs (looks like the old DOS Turbo Pascal...  :D ).
Quote
... that goes probably for Lazarus as well, last known to work was 0.9.x version
So to get a Lazarus IDE to work with FPC 2.6.0  I need to install a Lazarus version 0.9.x?

Quote from: GetMem
Search Lazarus source with a text crawler. Comment out "Process32FirstW" and "Process32NextW" then rebuild ...
Where do I find the Lazarus source?

Remy Lebeau

  • Sr. Member
  • ****
  • Posts: 324
    • Lebeau Software
Re: Message "... missing output KERNEL32.DLL...
« Reply #7 on: October 28, 2016, 10:22:02 pm »
Comment out "Process32FirstW" and "Process32NextW"

Or change them to use Process32FirstA() and Process32NextA() instead.  Or install the Microsoft Layer for Unicode library.

Windows ME is an Ansi-based OS, like Win9x is.  Only the NT family of OS versions (NTx, 2000, XP, and later) have Unicode APIs by default.
Remy Lebeau
Lebeau Software - Owner, Developer
Internet Direct (Indy) open source project - Admin, Developer

Remy Lebeau

  • Sr. Member
  • ****
  • Posts: 324
    • Lebeau Software
Re: Message "... missing output KERNEL32.DLL...
« Reply #8 on: October 28, 2016, 10:26:53 pm »
I need a Windows version that allows direct I/O port access and that would be 95, 98 or ME, later versions do not allow that.

There are third party solutions available that provide I/O port access to user-mode applications.  You don't need to resort to using outdated OS versions.

What is svn?

The Version Control System that FreePascal and Lazarus use for their source code repositories:

http://subversion.apache.org

Where do I find the Lazarus source?

From the links on the Lazarus download page.
Remy Lebeau
Lebeau Software - Owner, Developer
Internet Direct (Indy) open source project - Admin, Developer

BlaiseP

  • New member
  • *
  • Posts: 8
Re: Message "... missing output KERNEL32.DLL...
« Reply #9 on: October 29, 2016, 09:01:35 pm »
Quote from: Thaddy
...that goes probably for Lazarus as well, last known to work was 0.9.x version
I now have Lazarus 0.9.30.4/FPC 2.6.0 installed on the ME computer, no problems yet. I opened my Pascal program and compiled it - also OK.

Now the same Pascal program, compiled on a Windows XP computer with Lazarus 1.6 /FPC 3.0.0 runs OK on Windows 98. On W95 it still gives kernel32 error messages.

I think I will abandon the W95 and get a USB I/O card for W-ME/XP,
like this one.
and see if I can get it to work.
« Last Edit: November 02, 2016, 11:51:45 pm by BlaiseP »

BlaiseP

  • New member
  • *
  • Posts: 8
Re: Message "... missing output KERNEL32.DLL...
« Reply #10 on: December 06, 2016, 02:00:49 pm »
So I bought two of the mentioned USB HID I/O devices, they came without anything else but the seller pointed me to the .dll, C++ source code and test programs download page on Baidu.com.

I translated the C++ code to Pascal as well as I could and after lots of Googling and trial and error I can now;
- initialise the devices
- get a list of devices
- open the devices
- turn the red 'work' LED on/off
- set the pins to input or output mode
- read the 'IN' pin  high/low values
- set the 'OUT' pins high/low
- close the devices
- free the device list
- deinitialise the devices

This is my test program so far;

Code: Pascal  [Select]
  1. program USBcmdTest2;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses   crt;
  6. // -------------------------------------------
  7. // C++ source code, example progs and .DLL for USB_IO_HID-stick downloaded from
  8. // http://pan.baidu.com/s/1sjI4r5F?qq-pf-to=pcqq.c2c
  9. //
  10. // More info:
  11. // - C++ <--> Pascal comparison: http://www.pp4s.co.uk/main/tu-c-table.html
  12. // - C++ tutorial: http://www.cplusplus.com/doc/tutorial/pointers/
  13. // - How to use usb_io_interface library:
  14. // - https://github.com/pavel-a/usb-digital-io16-hid/blob/master/doc/Readme_usb_io_interface_lib.md
  15. //
  16. // -------------------------------------------
  17. // usb_io_interface.dll contains:
  18. //
  19. // usb_io_init()
  20. // Call this before calling other library functions
  21. //
  22. // usb_io_get_device_list()
  23. // Enumerates all digital i/o devices plugged into the PC. Returns pointer to
  24. // linked list of usb_io_device_info structures.
  25. // Caller should free this list after finishing using the devices, by passing it
  26. // to usb_io_free_device_list.
  27. //
  28. // usb_io_free_device_list(usb_io_list);
  29. // - frees the list returned by usb_io_get_device_list
  30. //
  31. // usb_io_open_device(usb_io_list)
  32. // - opens a digital i/o device
  33. //
  34. // usb_io_get_all_pin_info(dev, &pi[0])
  35. // - returns array of pin_info structures for each pin
  36. //
  37. // usb_io_read_input_pin_value(dev, pin_IN, &inp)
  38. // - read state of an input pin
  39. //
  40. // usb_io_set_pin_mode(dev, pin_IN, INPUT_MODE, ipm);
  41. // - configure one I/O pin as input or output
  42. //
  43. // usb_io_write_output_pin_value(dev, pin_OUT, LOW_LVL)
  44. // set state of an output pin
  45. //
  46. // usb_io_close_device(hnd)
  47. // - closes the device handle opened by usb_io_open_device
  48. //
  49. // usb_io_set_work_led_mode(dev, WORK_LED_BLINK)
  50. // turns the green "work" LED on or off
  51. //
  52. // usb_io_uninit()
  53. // Finalizes the library
  54. // -----------------------------------------------------------------------------
  55.  
  56. const INPUT_MODE        = 0; OUTPUT_MODE   = 1;
  57.       LOW_LEVEL         = 0; HIGHT_LEVEL   = 1;         // HIGHT [sic] !
  58.       NO_INNNER_PULL_UP = 0; INNER_PULL_UP = 1;
  59.       CLOSE_WORK_LED    = 0; OPEN_WORK_LED = 1;
  60.  
  61.       USBIODLL = 'usb_io_interface.dll'; // .DLL supplied by device seller/manuf.
  62.  
  63. type pin_infoT = record                   // struct pin_info
  64.        pinIndex : word;                      // { unsigned pinIndex;
  65.        pinmode  : word;                     //   unsigned pinMode;
  66.        pinvalue : word;                      //   unsigned pinValue;   };
  67.      end;
  68.      pin_info_arrayT = array[0..16] of pin_infoT;
  69.      ppin_arrayT = ^pin_info_arrayT;
  70.                                     //    /*usb io board infomation structure */
  71.      pUSB_io_device_infoT = ^USB_io_device_info;
  72.      USB_io_device_info = record       // struct usb_io_device_info
  73.        serial_number : pChar;              // { unsigned char *serial_number;
  74.        device_path   : pChar;              //   char *device_path;
  75.        next          : pUSB_io_device_infoT; //   usb_io_device_info* next; };
  76.      end;
  77.  
  78.      pin_modeT       = INPUT_MODE..OUTPUT_MODE;
  79.      pin_levelT      = LOW_LEVEL..HIGHT_LEVEL;
  80.      input_pin_modeT = NO_INNNER_PULL_UP..INNER_PULL_UP;
  81.      work_led_modeT  = CLOSE_WORK_LED..OPEN_WORK_LED;
  82.  
  83. var  pin_mode      : pin_modeT;       // enum pin_mode  {INPUT_MODE = 0, OUTPUT_MODE = 1};
  84.      pin_level     : pin_levelT;      // enum pin_level {LOW_LEVEL = 0,  HIGHT_LEVEL = 1};
  85.      input_pin_mode: input_pin_modeT; // enum input_pin_mode {NO_INNNER_PULL_UP = 0,INNER_PULL_UP = 1};
  86.      work_led_mode : work_led_modeT;  // enum work_led_mode {CLOSE_WORK_LED = 0,OPEN_WORK_LED = 1};
  87.  
  88.      errcode, devs, hand1, hand2, pinnr : integer;
  89.      pDev, pDev1, pDev2                 : pUSB_io_device_infoT;
  90.      level                              : word;
  91. //
  92. // ============================.DLL functions ==================================
  93. //
  94. {/*init the USB IO Libary
  95.     @returns: This function returns 0 on success and -1 on error.       */
  96.     int EXPORT_API usb_io_init(void);  }
  97. function usb_io_init():integer;
  98.   stdcall; external USBIODLL name 'usb_io_init';
  99.  
  100. {/*Finalize the USB IO Libary.
  101.     This function frees all of the static data associated with USB IO Libary.
  102.     It should be called at the end of execution to avoid memory leaks.
  103.     @returns:This function returns 0 on success and -1 on error.        */}
  104. //int EXPORT_API usb_io_uninit(void);
  105. function usb_io_uninit():integer;
  106.   stdcall; external USBIODLL name 'usb_io_uninit';
  107.  
  108. {/*Enumerate the USB IO Devices.
  109. @returns: This function returns a pointer to a linked list of type
  110. struct #usb_io_device_info, containing information about the usb io devices
  111. attached to the system, or NULL in the case of failure.
  112. Free this linked list by calling free_usb_io_device_list(). */}
  113. //struct usb_io_device_info EXPORT_API * usb_io_get_device_list(void);  }
  114. function usb_io_get_device_list():pusb_io_device_infoT;
  115.   stdcall; external USBIODLL name 'usb_io_get_device_list';
  116.  
  117. {/*This function frees a linked list created by get_usb_io_device_list().*/ }
  118. //void EXPORT_API usb_io_free_device_list(struct usb_io_device_info*);
  119. procedure usb_io_free_device_list(pDev:pusb_io_device_infoT);
  120.   stdcall; external USBIODLL name 'usb_io_free_device_list';
  121.  
  122. {/*open a usb io device
  123. @return: This funcation returns a valid handle to the device on success or 0 on failure. */}
  124. //int EXPORT_API usb_io_open_device(struct usb_io_device_info *device_info);
  125. function usb_io_open_device(pDev:pusb_io_device_infoT):integer;
  126.   stdcall; external USBIODLL name 'usb_io_open_device';
  127.  
  128. {/*close a usb io device opend by open_usb_io_device()  */ }
  129. //void EXPORT_API usb_io_close_device(int hHandle);
  130. procedure usb_io_close_device(hhand:integer);
  131.   stdcall; external USBIODLL name 'usb_io_close_device';
  132.  
  133. {/*open or close the green indicator light
  134. @param:
  135. hHandle:    the return value of open_usb_io_device();
  136. led_mode:   open or close
  137. @returns:   returns 0 on success and others on error.
  138. @description: when opened the work led, the green led will flashing when works.    */}
  139. //int EXPORT_API usb_io_set_work_led_mode(int hHandle, work_led_mode led_mode);
  140. function usb_io_set_work_led_mode(hHandle:integer; led_mode:work_led_modeT):integer;
  141.   stdcall; external USBIODLL name 'usb_io_set_work_led_mode';
  142.  
  143. {/* set the work mode of io pin
  144. @param:
  145. hHandle:    the return value of open_usb_io_device();
  146. pinIndex:   pin number of usb io. valid number is 0 to 15
  147. mode:       input mode or output mode
  148. innerPullUp: this param will be used when the pinIndex was set INPUT_MODE.
  149. When set param mode to INPUT_MODE and set innerPullUp to INNER_PULL_UP,
  150. the value (read out use read_usb_io_input_pin_value() ) of pinIndex pin equal 1
  151. if no input on pinIndex pin.
  152. We advice you to set the param innerPullUp to INNER_PULL_UP when param mode is INPUT_MODE.
  153. @returns: return 0 on success, others on failure. */  }
  154. //int EXPORT_API usb_io_set_pin_mode(int hHandle, unsigned pinIndex, pin_mode mode, input_pin_mode innerPullUp);
  155. function usb_io_set_pin_mode(hHandle:integer; pinIndex:word; mode:pin_modeT;innerPullUp:input_pin_modeT):integer;
  156.   stdcall; external USBIODLL name 'usb_io_set_pin_mode';
  157.  
  158. {/*set the value of output pin
  159. @param:
  160. hHandle:    the return value of open_usb_io_device();
  161. pinIndex:   pin number of usb io. valid number is 0 to 15
  162. level:      low or high level
  163. Attention: ouputPinIndex must be a output pin that was set by set_usb_io_pin_mode() funcation.
  164. @returns: return 0 on success, other on failure */  }
  165. //int EXPORT_API usb_io_write_output_pin_value(int hHandle, unsigned ouputPinIndex, pin_level level);
  166. function usb_io_write_output_pin_value(hHandle:integer; outputPinIndex:word; level:pin_levelT):integer;
  167.   stdcall; external USBIODLL name 'usb_io_write_output_pin_value';
  168.  
  169. {/*get the value of input pin of pinIndex
  170. @params:
  171. hHandle:    the retrun value of open_usb_io_device();
  172. pinIndex:   pin number of usb io. valid number is 0 to 15
  173. level:      a non-null pointer. the value of input pin stored in this param. 0 -- low level, 1 -- high level
  174. @returns: return 0 on success, other on failure    */   }
  175. //int EXPORT_API usb_io_read_input_pin_value(int hHandle, unsigned pinIndex, unsigned *level);
  176. function usb_io_read_input_pin_value(hHandle:integer; outputPinIndex:word; VAR level:word):integer;
  177.   stdcall; external USBIODLL name 'usb_io_read_input_pin_value';
  178.  
  179. {/*get the value of all pin
  180. @param:
  181. hHandle:    the retrun value of open_usb_io_device();
  182. @returns:   return 0 on success, other on failure    */     }
  183. //int EXPORT_API usb_io_get_all_pin_info(int hHandle, pin_info info[16]);
  184. function usb_io_get_all_pin_info(hHandle:integer; info:pin_info_arrayT):integer;
  185.   stdcall; external USBIODLL name 'usb_io_get_all_pin_info';
  186. //
  187. // ============================ end .DLL functions =============================
  188. //
  189. // more procs & funcs go here
  190. //
  191. procedure errmess(ec:integer);
  192. begin
  193.   write ('error code: ', ec, ' ');
  194.   if ec = 0 then writeln ('OK.')
  195.   else writeln ('error.');
  196. end; // errmess
  197. // -------------------
  198. procedure polldevice(devnr,hand:integer);
  199. var pin_nr :integer;
  200.     kar :char;
  201. begin
  202.   clrscr;
  203.   writeln('Poll all 16 input pins of dev ',devnr);
  204.   writeln('Hit any key to stop');
  205.   repeat
  206.     gotoxy(1,3);
  207.     writeln ('pinnr  level ');
  208.     for pin_nr := 0 to 15 do begin
  209.       write (pin_nr:3,' = ');
  210.       errcode := usb_io_read_input_pin_value(hand,pin_nr,level);
  211.       if errcode = 0 then writeln (level)
  212.       else writeln ('?');
  213.     end;
  214.    until keypressed;
  215.    kar := readkey;
  216. end;  // polldevice
  217. // ----------------------------- main prog -------------------------------------
  218. begin // main program
  219.   writeln ('Prog. USB IO cmd test 2.');
  220.   writeln ('------------------------');
  221.  
  222.   writeln ('init IO devices:');
  223.   errcode := usb_io_init();
  224.   errmess (errcode);
  225.   writeln ('------------------------');
  226.   //
  227.   // -------------------------------------------
  228.   //
  229.   writeln ('Get device list:');
  230.   devs := 0;                           // assume number of USB devices = 0
  231.   pDev1 := usb_io_get_device_list();   // pointer to USB dev #1 in list
  232.   if pDev1 = nil then begin
  233.    writeln ('No USB IO devices found.');
  234.   end
  235.   else begin;                           // at least one device found
  236.     pDev  := pDev1;                     // save pointer to dev #1
  237.     pdev2 := pdev^.next;                // save pointer to dev #2
  238.     while pDev <> nil do begin
  239.        devs := devs+1;
  240.        writeln(' Dev ',devs);
  241.        writeln(' - serial number = ');
  242.        writeln (pDev1^.serial_number);
  243.        writeln(' - device path   = ');
  244.        writeln (pDev1^.device_path  );
  245.        pDev := pdev^.next;
  246.     end;
  247.     writeln(devs, ' USB IO devices found.');
  248.     writeln ('Hit <enter> to continue...');
  249.     readln;
  250.   //
  251.   // -------------------------------------------
  252.   //
  253.     clrscr;
  254.     writeln;
  255.     writeln ('Open dev 1');
  256.     hand1 := usb_io_open_device(pDev1);
  257.     if hand1 > 0 then begin                   // device opened OK, turn LED on
  258.        writeln ('LED on... ');
  259.        errcode := usb_io_set_work_led_mode(hand1,1);
  260.        errmess(errcode);
  261.        if errcode = 0 then begin              // LED turned on ok, turn it off
  262.          writeln ('Hit <enter> to turn LED off');
  263.          readln;
  264.          writeln ('LED off.');
  265.          errcode := usb_io_set_work_led_mode(hand1,0);
  266.          errmess(errcode);
  267.        end;
  268.        writeln ('Hit <enter> to set pins to output...');
  269.        readln;
  270.        clrscr;
  271.        writeln ('Set all 16 pins of dev 1 to output:');
  272.        for pinnr := 0 to 15 do begin
  273.          writeln ('pinnr ',pinnr);
  274.          errcode := usb_io_set_pin_mode(hand1,pinnr,OUTPUT_MODE,INNER_PULL_UP);
  275.          errmess(errcode);
  276.        end;
  277.        writeln ('Hit <enter> to make pins high...');
  278.        readln;
  279.        clrscr;
  280.        writeln('Make all 16 pins of dev 1 high:');
  281.        for pinnr := 0 to 15 do begin
  282.          writeln ('pinnr ',pinnr);
  283.          errcode := usb_io_write_output_pin_value(hand1,pinnr,1);
  284.          errmess(errcode);
  285.        end;
  286.        writeln;
  287.        usb_io_close_device(hand1);
  288.        writeln ('dev 1 closed');
  289.     end
  290.     else begin   // handle = 0, error opening device
  291.       errmess (hand1);
  292.     END;
  293.   //
  294.   // -------------------------------------------
  295.   //
  296.     writeln ('Hit <enter> to turn dev 2 LED on...');
  297.     readln;
  298.     clrscr;
  299.     writeln;
  300.     writeln ('Open dev 2');
  301.     hand2 := usb_io_open_device(pDev2);
  302.     if hand2 > 0 then begin                  // device opened OK, turn LED on
  303.        writeln ('LED on... ');
  304.        errcode := usb_io_set_work_led_mode(hand2,1);
  305.        errmess(errcode);
  306.        if errcode = 0 then begin             // LED turned on ok, turn it off
  307.          writeln ('Hit <enter> to turn dev2 LED off');
  308.          readln;
  309.          writeln ('LED off.');
  310.          errcode := usb_io_set_work_led_mode(hand2,0);
  311.          errmess(errcode);
  312.        end;
  313.        writeln ('Hit <enter> to set all 16 dev 2 pins to input...');
  314.        readln;
  315.        clrscr;
  316.        writeln('Set pins of dev 2 to input:');
  317.        for pinnr := 0 to 15 do begin
  318.          writeln ('pinnr ',pinnr);
  319.          errcode := usb_io_set_pin_mode(hand2,pinnr,INPUT_MODE,INNER_PULL_UP);
  320.          if errcode = 0 then writeln ('ok')
  321.          else errmess(errcode);
  322.        end;
  323.        writeln ('Hit <enter> to read pins...');
  324.        readln;
  325.  
  326.        polldevice(2,hand2);
  327.  
  328.        writeln;
  329.        usb_io_close_device(hand2);
  330.        writeln ('dev 2 closed');
  331.     end
  332.     else begin   // error opening device
  333.       errmess (hand2);
  334.     END;
  335.   end;
  336.   writeln ('------------------------');
  337.   //
  338.   // -------------------------------------------
  339.   //
  340.   writeln ('Hit <enter> to finish...');
  341.   readln;
  342.   clrscr;
  343.   writeln ('Free device list:');
  344.   usb_io_free_device_list(pDev1);      // even if NIL
  345.  
  346.   writeln ('UN-init IO devices:');
  347.   errcode := usb_io_uninit();
  348.   errmess (errcode);
  349.   writeln ('------------------------');
  350.  
  351.   writeln;
  352.   writeln('Hit any key to exit...');
  353.   readln;
  354. end.  // main program
  355.  

What I cannot yet do is get the device serial number and 'path' as I do not understand how to translate that part of the C++ code in the device's info "struct" to Pascal. I left some of the relevant C++ code in comments in the program (notably lines 70..75).

My first question is; how do I get the devices' serial number and path?

Edit: found it.
'serial_number' and 'device_path' are of type pChar (null character limited string).
« Last Edit: December 07, 2016, 06:04:58 pm by BlaiseP »

marcov

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 5644
Re: Message "... missing output KERNEL32.DLL...
« Reply #11 on: December 06, 2016, 02:28:38 pm »
Note that there are DLLs that enable you to do port access on newer. Search for e.g.  "InpOut32.dll"

 

Recent

Get Lazarus at SourceForge.net. Fast, secure and Free Open Source software downloads Open Hub project report for Lazarus