Problem mit 2 fehlermeldungen unter Borland C++ Builder 5
-
Hallo hab dieses Programm abgeschrieben aus dem netz in dem Thema wurde behauptet das für die EnumWindows() Funktion die user32.lib benötigt wird habe diese so eingebunden wie es im Bsp stand leider sagt mir mein Borland C++ Builder 5
[Linker Fataler Fehler] Fatal: Unable to open file 'USER32.LIB'
der Code für diese Fehlermeldung ist:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <Psapi.h>
#include "UWinApi2.h"
#include <string.h>
#pragma comment(lib, "user32.lib")//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle);
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam);
int _stricmp( const char *string1,const char *string2);//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
EnumWindows((WNDENUMPROC)EnumProc, NULL);
}
//---------------------------------------------------------------------------BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
//
// Jetzt haben wir ein HWND irgendeines Fensters
// Also holen wir uns den Pfad zur zugehörigen EXE
//
char Buffer[MAX_PATH];
char szPfadMitExe[]="c:\Windows\NotePad.exe";
ZeroMemory(Buffer, sizeof(Buffer)); // Buffer leer machen...
GetPathFromHandle(hwnd, Buffer);
if (_stricmp(Buffer, szPfadMitExe)==NULL)
{
//
// _stricmp vergleich 2 strings miteinander
// wobei es GROSS- und kleinschreibung
// komplett ignoriert!
// Oha, es MUSS notepad.exe sein!
// Also beenden wir es mal...
//
SendMessage(hwnd, WM_CLOSE, NULL, NULL);
return FALSE; // FALSE = EnumWindows kann aufhören
}
else return TRUE; // TRUE = weitermachen, Notepad ja noch nicht drangewesen!
}void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle)
{
//
// benötigt psapi.lib und psapi.h!!!
// läuft nur unter NT-basierenden Windows
// Also WinNT, Win2000, WinXP!
//
DWORD lpdwProcessId;
HANDLE hProcessHandle;GetWindowThreadProcessId(hWnd, &lpdwProcessId);
hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, lpdwProcessId);
GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH);
CloseHandle(hProcessHandle);
}Was mach ich Falsch???
Wenn ich die #pragma comment(lib, "user32.lib") entferne
dann bekomme ich diesen Fehler:
[Linker Fehler] Unresolved external 'GetModuleFileNameExA' referenced from C:\PROGRAMME\BORLAND\CBUILDER5\PROJECTS\UWINAPI2.OBJ
und
[Linker Fehler] Unresolved external '_stricmp(const char *, const char *)' referenced from C:\PROGRAMME\BORLAND\CBUILDER5\PROJECTS\UWINAPI2.OBJ
natürlich habe ich mich durch die Hilfe durchgelesen bloß es gibt dort ein haufen möglichkeiten.
Hat der Borland Builder denn nicht schon alle Libs??für solche zwecke??
Habe jetzt die winuser.h eingebunden und der selbe effekt mit den letzten beiden fehlermeldungen.
-
Ist WinApi! Die Borland-CBuilder haben eine vollständige Hilfe für alle WinApi-Funktionen. Dort steht auch, welche Header-Dateien eingebunden werden müssen. Es ist voll ausreichend, nur diese Header-Dateien einzubinden. Die WinApi-Funktionen stehen auch nicht in LIBs, sondern in DLLs. Deren Einbindung macht der Linker selbst. Hilfe -> Win32SDK -> Index -> Funktionsname -> Lesen!
-
Danke für die Antwort werd mich dran halten.
Hab den Borland C++ Builder 5 dort finde ich in der Win32 Suche keine _stricmp() Beschreibung
gehört die Überhaupt dazu?
-
Such einfach mal per Google und du wirst wissen warum.
-
bis ich genau das finde was ich suche dauerts weist das den??
ich suche parallel aber wenn dus weist sags mir bitte
-
_stricmp ist kein Standard C++ sondern wohl eine Erweiterung von Microsoft.
Eine Erläuterung gibts z.Bsp. hier
http://msdn.microsoft.com/en-us/library/aa273371.aspx
-
Hallo ich hab mir die msdn schon öffters angeguckt dachte immer meine Fehlermeldungen liegen an den Libs oder ähnliches habe auch schon alle Header Dateien ausprobiert die man da so braucht immer das gleiche Problem.
Ich guck mal Weiter vielleicht liegts ja an einem Code Fehler.
Das mit den Headern kann ich ja vorerst auschließen
-
Dieser Fehler:
[Linker Fataler Fehler] Fatal: Unable to open file 'USER32.LIB'
liegt vermutlich daran, dass der Linker den Pfad zu USER32.LIB nicht kennt. Ich babe mit C++-Builder nichts zu tun, aber normalerweise kann man die Suchpfade in den Settings angeben. Manche Compiler verwenden auch zusätzlich die Environment-Variable "LIB", die wie "PATH" formatiert ist. Schließlich kann man die Pfade auch über Kommandozeilen-Parameter angeben. Beim GCC beispielsweise mit:
-L<Pfad zu den Libraries>
bei Msvc ist es:
/LIBPATH:<Pfad zu den Libraries>
Stefan.
-
@mkRE
Nimm mal das#pragma comment(lib, "user32.lib")
einfach raus. Wenn der Builder dann diese lib immer noch nicht findet füge sie über das Hauptmenü mit "Projekt/Dem Projekt hinzufügen" zu.
Eine andere Variante ist: klicke mit der rechten Maustaste auf dein Projekt im Projektmanager. Da gibt es auch einen Punkt "Hinzufügen".
-
Ok ich versuchs heut abend mal Danke echt für eure/deine Tipps!!!Das freut mich sehr!!!:-)
-
So eine Fehlermeldung ist mir jetzt übergeblieben hat mit dieser _stricmp zu tun ich guck mal gleich also die tipps haben mich schon weiter gebracht ich meld mich wenn wenn gleich klappen sollte.
Habe dem Projekt wie du sagtest die psai.lib beigefügt somit ist eine Fehlemeldung weg jetzt habe ich die Funktionsfehlermeldung noch.User32.Lib auch eingefügt ok aber user32.h erkennt der nicht
ich guck mal
[Linker Fehler] Unresolved external '_stricmp(const char *, const char *)' referenced from C:\PROGRAMME\BORLAND\CBUILDER5\PROJECTS\UWINAPI2.OBJ
-
Du hast oben in deiner cpp eine Deklaration der _strcimp stehen. Ich sehe aber nirgens eine Definition. Kommentiere diese Zeile mal aus.
-
Definition?warte mal
ich guck mal durch.ich deklariere eine Funktion mit Ihren verwendeten Variablen Typen oben und dann verwende ich diese oder net??
Hole mal mein buch das kann doch net sein
-
Falls der BCB5 _stricmp nicht kennt schau dir das mal an.
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=stricmp#Answ
-
Also stimmt mit dem Funktionsaufruf alles?
ich habs jetzt oben den Prototypen so (int _stricmp(const char *Buffer,const char *szPfadMitExe);) erstellt ohne den klammern natürlich weiter der gleiche Fehler.
Zu dem Link du meinst ich soll die _strcmp gar nicht nutzen sondern den vergleich anders durchführen??
-
Jetzt weiß ich was du meinst mit der definition ich kann mir die namen nicht merken lange her mit Progen und schule
aber ja hast recht eigenlich fehlt der Funktionskörper doch da es sich ja um eine Funktion von Windows handelt weiß ich nicht was ich da reinschreiben soll vielleicht brauch ich echt noch eine lib und header datei??hab gelesen das mit User32.h und lib die lib hab ich gefunden aber die "h" nicht. Hab gelesen das das ich die linken soll weis jetzt echt nicht wie ich das beim bcb5 machen soll ansonsten die andre idee von dir falls ichs richtig verstanden habe eine eigene Vergleichs funktion zu machen.???
Ist das richtig??
-
Nimm die Deklaration einfach raus. Wenn der Builder stricmp dann nicht kennt nimm eine eigene Version.
Da du den Builder verwendest könntest du auch eine Funktion aus der VCL nehmen. Z. Bsp. AnsiCompareIC (siehe Hilfe).
Du musst dann nur noch deine Strings in AnsiString umwandeln. Wenn du darüber mehr wissen willst frag nochmal im Builder-Forum nach.
PS:
Versuch mal ein paar mehr Satzzeichen etc. zu verwenden. Dein letzter Post war schwer zu entziffern.
-
int __fastcall AnsiCompareIC(const AnsiString& rhs) const;
ok verstehe aber soll ich die so ehnlich einbinden wie die _str...?
das macht mich unsicher.
-
Die sollst du nur verwenden. Wenn du vcl.h bei den Include mit drin hast reicht das schon.
-
Ich guck mir auf jedenfall die Funktion an ich hab noch kein schimmer wie ich das als ersatz für die _strcmp() machen soll aber Vielleicht klappts.
int __fastcall AnsiCompareIC(const AnsiString& rhs) const;
Das (AnsiStrings& rhs) macht mir sorgen verstehe das er ein String mit dem rhs vergleicht kommt da mein Buffer rein??oder kannst du mir sagen was dieses & dort bedeutet??