Borland C, WinDLL, funktion importieren
-
Hallo,
ich möchte eine WinDLL mit Borland C erstellen, und die Funktionen exportieren.
Bei einer Libary die ich Importirtrn will, gibt es eine Function
short GetKey()Wenn ich diese Funktion aufrufe wird versucht die GDI.DLL zu laden.
Die Funktion (mit diesem Namen) ist aber in einer importieren Libery (Headerfiel ist importiert).
Danke
Martin
-
Hast du schonmal selber versucht, aus dem was du da so geschriebenhast schlau zu werden?
-junix
-
Hallo,
unten habeich den C-Code angehängt.
(habe den Code um die funktionsfähigen function's gekürzt, alle herausgenommenen Function's sind vergleichbar. Die Function BeepOn_ fuktioniert einwandfrei)Nun mein Problem:
Ich erstelle eine DLL, die ich in einem Pascal-Program über eine Import-Unit
importiere (Funktioniert mit BeepOn_ sehr gut). Das Pascal Programm ist ein DOS-Protected-Mode Programm, und läuft auf einem DOS-Termial mit Barcodescanner. Die C-Libary wird vom Gerätehersteller mitgeliefert
(auch für Borland C) um die Gerätespezifische Hardware Anzusteuern.
GetKey liefert auch Informationen über die Besonderheiten der Installierten Tastatur.Das Problem liegt nun daran das wenn ich die Fuction GetKey() verwende versucht wird die DLL GDI.DLL zu laden die nicht vorhanden ist.
Ich habe die Vermutung das in der Libary eine Function oder Procedure gelinkt wird, die es auch in der WINDOWS.H gibt, die aber aus GDI.DLL importiert wird.
Es handelt sich alles um DOS-Function-Calls.
Das 2. Problem das ich habe ist die Function GetBattLevel().
Diese Function scheint Real-Rechenoperationen durchzuführen.
Wenn ich diese Function mit linke, wird versucht die DLL WIN87EM.dll zu laden.
Ich habe versucht den C-Compiler auf Emulation, 8087, 80287/387, und none zu stellen aber hatte keinen Erfolg.Das erste Problem ist mir am wichtigtsten.
Martin
############################################################################### #include <stdio.h> #include <dos.h> //#include <conio.h> #include <windows.h> #include "dl_lib.h" #include "T232HD.h" extern "C" SHORT _far _pascal _export GetKey_() { return GetKey(); } extern "C" BYTE _far _pascal _export GetBattLevel_() { return GetBattLevel(); } extern "C" void _far _pascal _export BeepOn_(WORD a1, WORD a2) { BeepOn(a1,a2); return; } //int _far _pascal LibMain (HINSTANCE hInstance, WORD wDataSeg, WORD cbHeapSize, LPSTR lpCmdLine) int _far _pascal LibMain (HINSTANCE , WORD , WORD , LPSTR ) { return(1); };Edit:
Bitte die Code-Tags benutzen. Danke!
-
martin2 schrieb:
Ich habe die Vermutung das in der Libary eine Function oder Procedure gelinkt wird, die es auch in der WINDOWS.H gibt
Na dann stell doch mal die include-Reihenfolge um.
-
#include "T232HD.h"
#include "dl_lib.h"
#include <windows.h>Ich habe bereits versucht die Reihenfolge zu tauschen, es fehlten dann #Define anweisungen, habe diese dann auch angepasst, hatte aber keine Wirkung.
Jetzt experimentiere ich mit einer Kopie der windows.h und versuche nur die benötigten Teile zu deffinieren.
Jetz bekomme ich die Meldung das LibMain nicht deffiniert ist, die Hilfe sagt dass:
Program entry point may not reside in an overlay
(Der Einsprungspunkt des Programms darf nicht in einem
Overlay liegen)Diese Meldung erscheint üblicherweise, wenn die Option /o
vor dem Startup-Modul (C0x) angegeben wurde.C0x enthält den ersten Einsprungspunkt des Programms, der
nicht überladen werden darf.Geben Sie die Option /o nach dem Startup-Modul an, um den
Fehler zu beheben.Martin