dll Programmieren
-
Hallo Forum!
Ich habe ein kleines Problem:
Ich habe ein Beispielsource einer dll gefunden. Nach der kompilierung kam, wen wunderts, eine dll zu stande.
Aus einem VB-Beispielprogramm, kann ich nun sämtliche Funktionen die in dem Beispiel bereits integriert waren, aufrufen. Die einzigste Funktion die ich nicht aufrufen kann, ist die von mir eigens hinzugefügte.
Ich bekomme im VB eine Meldung:
Can´t find DLL entry point CaptureScreen in test_dll.dllGibt es etwas was ich beachten muss?
Normalerweise müsste doch wenn ich in der selben Form der vorgegebenen Beispielfunktionen eine hinzufüge doch kennen...Ich bin für jeden Tipp dankbar!
Bel
P.S.
Wenn der Beitrag im falschen Forum ist, tut es mir leid. Allerdings wüsste ich nicht wohin ich das Problem sonst schreiben sollte. Die anderen Foren passen noch weniger.
-
funktionen, die du von extern aufrufen willst, musst du auch als extern deklarieren!
zeig mal wenig code!
-
So siehts derzeit aus:
BOOL _stdcall CaptureScreen (bool input); signed long _stdcall StdVar_Byte (unsigned char ByValValue, unsigned char *ByRefValue); BOOL WINAPI DllEntryPoint ( HINSTANCE hDLL, DWORD dwREASON, LPVOID Reserved ) { switch (dwREASON) { case DLL_PROCESS_ATTACH: { break; } case DLL_PROCESS_DETACH: { break; } } return TRUE; } //////////////////////////////////////////////////////////////////// // Hier bitte mehrere Testfunktionen rein denken, die funktionieren // ein bsp. //////////////////////////////////////////////////////////////////// //------------------------------------------------------------------------ signed long _stdcall StdVar_Byte (unsigned char ByValValue, char *ByRefValue) { ByValValue++; *ByRefValue = *ByRefValue + 2; return (ByValValue); } //------------------------------------------------------------------------ BOOL _stdcall CaptureScreen (bool input) { HDC hDC; PictureBox *pbox; hDC = GetDC(NULL); //Get full screen HDC hMemDC = CreateCompatibleDC(hDC); SIZE size; size.cx = GetSystemMetrics(SM_CXSCREEN); size.cy = GetSystemMetrics(SM_CYSCREEN); { size.cx = r.right-r.left; size.cy = r.bottom-r.top; } HBITMAP hBitmap = CreateCompatibleBitmap(hDC, size.cx, size.cy); pbox->Image->Save("C:\\Z.Jpg", Drawing::Imaging::ImageFormat::Jpeg); if (hBitmap) { HBITMAP hOld = (HBITMAP) SelectObject(hMemDC, hBitmap); BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY); SelectObject(hMemDC, hOld); DeleteDC(hMemDC); ReleaseDC(NULL, hDC); DeleteObject(hBitmap); } return TRUE; }
Soviel zum C Code
Im VB siehts so aus:
Private Declare Function StdVar_Byte Lib "test_dll.dll" _ (ByVal ByValValue As Byte, ByRef ByRefValue As Byte) As Long Private Declare Function CaptureScreen Lib "test_dll.dll" _ (ByVal ByValBool) As Boolean
StdVar_ByValByte = StdVar_Byte(StdVar_ByValByte, StdVar_ByRefByte)
funktioniert einwandfrei
returnvalue = CaptureScreen(False)
aber leider nicht.
-
Ok, da steht die Funktion. Aber wird diese auch exportiert? Ich rate mal, daß bei diesem Projekt noch ein Def-File dabei ist. Hier mußt Du Deine Funktion dem EXPORTS-Abschnitt hinzufügen.
BTW: Das direkt Gegenstück zum Basic-Typ 'Boolean' ist nicht 'BOOL', sondern 'VARIANT_BOOL'. Außerdem darfst Du nicht einfach 'TRUE' zurückgeben, VB erwartet hier -1. AFAIK und IIRC.
[ Dieser Beitrag wurde am 09.01.2003 um 14:45 Uhr von -King- editiert. ]
-
Ihr hattet recht.
In der .def datei Standen natürlich alle Beispielfunktionen nur meine nicht.ok...
Eingebaut...Jetz sagt er mir:
Screenydll fatal error LNK1561: Einstiegspunkt muss definiert seinEr hat doch nen DllEntryPoint
Übrigens hab ich das BOOL wieder durch void ersetzt, war nur testweise reingerutscht.
-
Benenne 'DllEntryPoint' mal um in 'DllMain'.
-
selber fehler
-
Ich arbeite mit der .NET Entwicklungsumgebung.
Nach ein bisschen rumfrickeln, ist mir folgendes aufgefallen:Ich kann unter den Projekteigenschaften den Konfigurationstypen festlegen.
Dieser stand auf .exe und hat mir (mit den Beispielfunktionen) eine .dll erzeugt. Ich habe die Einstellung mal auf .dll gestellt. Der Fehler ist weg, allerdings erzeugt die Umgebung mir nun eine .exeVielleicht bringt euch das ja auf eine Spur.