![]() |
DLL in C mit dem GCC
Liste der Anhänge anzeigen (Anzahl: 1)
Ich versuche gerade eine DLL mit dem GCC zu schreiben und sie in einem Delphi Programm zu verwenden:
FirstDLL.c:
Code:
FirstDLL.h:
#include <windows.h>
#include "FirstDLL.h" int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { return 1; } EXPORT int add(int a,int b) { return a+b; }
Code:
Und der Aufruf in Delphi:
#ifndef FIRSTDLL_H_
#define FIRSTDLL_H_ #endif /*FIRSTDLL_H_*/ #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT int add(int,int);
Delphi-Quellcode:
Wen ich jetzt aber auf den Button klicke bleibt das Programm bei LoadLibrary einfach hängen und reagiert nicht mehr. Was mache ich da falsch?
type
TAdd = function(a, b: Integer): Integer; procedure TForm1.Button1Click(Sender: TObject); var hLib: THandle; s: String; begin s := IncludeTrailingBackSlash(ExtractFilePath(ParamStr(0)))+ 'FirstDLL.dll'; hLib := LoadLibrary(PChar(s)); if hLib <> 0 then begin FreeLibrary(hLib); end else ShowMessage(SysErrorMessage(GetLastError)); end; Ich habe mal die DLL mit dem DeopendencyWalker geöffnet. ScreenShot im Anhang. Irgendwie will er eine MSJava.dll einbinden, aber die habe ich auf meinem ganzen System nicht gefunden. |
Re: DLL in C mit dem GCC
Keine Ahnung was du da machst. ;)
Du kannst aber event. dort was für dich herrauslesen: ![]() Ggf. noch stdcall; oder cdecl noch angeben ? :gruebel: |
Re: DLL in C mit dem GCC
Hm, nicht wirklich.
|
Re: DLL in C mit dem GCC
das mit dem Java-Ding ist unwichtig, daran liegt es nicht.
hat Mattis Link geholfen? |
Re: DLL in C mit dem GCC
Nur in sofern, dass ich wohl keine DLLMain brauche. Ich abe jetzt nur:
Code:
Das klappt aber trotzdem nicht. :gruebel:
#include <windows.h>
//#include "FirstDLL.h" #define EXPORT __declspec(dllexport) /*int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { return 1; }*/ EXPORT int add(int a,int b) { return a+b; } |
Re: DLL in C mit dem GCC
Nur so eine Idee: kann es sein, dass die Anwendung die Cygwin.dll zuerst laden muss? Also ehe eine DLL die dann ebenfalls benutzen kann?
Probiere mal, mit ![]() |
Re: DLL in C mit dem GCC
Ja, also diese Cygwin.dll DLL musste ich auch bei normalen Exe-Programmen immer in das Exe Verzeichnis legen, damit es funktioniert. Die wollte ich sowieso iregndwie los werden. Die Cygwin.dll habe ich dann auch in das DLL-Verzeichnis gelegt, von wo aus ich die DLL lade, das hat aber auch nicht geholfen.
Wie compiliere ich gegen die MSVCRT.DLL mit dem GCC? Wo muss ich da bei Eclipse was einstellen? |
Re: DLL in C mit dem GCC
Neue Informationen.
Dieser Code:
Code:
Mit dem VC2005 kompiliert funktioniert. Ich müsste es nur schaffen das name mangling beim VC zu deaktivieren. Aber das ist ein anderes Problem. Es scheint also mit dem zusammenzuhängen, was Flocke vermutet.
// FirstDLL.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
// #include "stdafx.h" #include "FirstDLL.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } EXPORT int add(int a,int b) { return a+b; } |
Re: DLL in C mit dem GCC
So, in zwei Stunden muss ich mich wohl wieder mit dem Problem auseinandersetzen. Es muss doch eine Möglichkeit geben mit dem GCC und Eclipse eine C-DLL zu schreiben, die man auch laden kann. Kann mir eventuell mal jemand eine C-DLL mit dem GCC geschrieben geben, die ich testen kann?
|
Re: DLL in C mit dem GCC
Wie ich oben schon schrieb, habe ich hier auf einem anderen Rechner MINGW installiert, das in seiner Standardkonfiguration (so wie hier installiert) gegen die MSVCRT.DLL linkt.
Die neueren Versionen von CYGWIN / MINGW können so weit ich weiß beides, ich habe es aber noch nicht ausprobiert. Es müsste über einen Compiler-Switch einstellbar sein. Leider habe ich heute nicht die Zeit, dir da ausführlicher zu helfen. |
Re: DLL in C mit dem GCC
Liste der Anhänge anzeigen (Anzahl: 1)
Also in der DLL sehen ich mit dem DependencyWalker, dass die cygwin1.dll benötigt wird. Aber auch wenn ich sie in das Verzeichnis reinlege, von dem ich die DLL lade, hängt mein Programm eine Weile und dann war es das.
Ich habe mal mein Projekt angehangen. Eventuell kann damit ja jemand was anfangen. |
Re: DLL in C mit dem GCC
So, es gibt was neues: Wenn ich die DLL statisch linke geht es. :gruebel:
Warum ist das so? Und was muss ich machen, dass es auch dynamisch geht? Ergo, das alte Problem besteht noch. |
Re: DLL in C mit dem GCC
Wechsel zu MinGw, den Cygwin Linker kannst du aber weiterhin benutzen. Dann sollte es, wenn der MinGw-Compiler korrekt "installiert" ist, einwandfrei funktionieren.
|
Re: DLL in C mit dem GCC
Nein, das ändert auch nichts am Verhalten. :( Aber wenn ich auch den MinGw Linker nehme, dann geht es. :firejump:
|
Re: DLL in C mit dem GCC
So, hier noch einige Ideen:
1. Probiere mal, ob es den Kommandozeilenschalter "-mno-cygwin" beim GCC gibt (wo du das in Eclipse einstellen kannst weiß ich nicht, ich arbeite immer auf der Kommandozeile bzw. mit MAKE). 2. Unter ![]() // Roten Kasten gesehen und ignoriert :mrgreen: |
Re: DLL in C mit dem GCC
Aber trotzdem Danke für deine Mühe. :hi:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz