www.mikrocontroller.net

Forum: PC-Programmierung LoadLibrary


Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe eine Anwendung in embedded VC++, die während der Laufzeit
dlls mit Loadlibrary läd.
Damit weitere zu ladende dlls ohne die Anwendung neu zu übersetzen
hinzugefügt werden können, habe ich eine Textdatei, aus der ich die
Namen der dlls in ein Feld
  'unsigned short DllDatei[20]'
einlese.
Die Dlls werden dann mit
    LoadLibrary(..., (unsigned short*)&DllDatei[0])
geladen. Das hat soweit auch funktioniert.

Nun verwende ich den gleichen Code auch in einem Win32 Projekt in VC++
2003.(Man braucht keine Zielhardware mit WinCE mehr).
Es kommt allerdings ein Fehler, dass unsigned short * nicht in LPCSTR
konvertiert werden kann, was in eVC++ noch ging.

LPCSTR ist als 'const CHAR *LPCSTR' definiert.

Wenn ich den Aufruf in:
    LoadLibrary(..., (CHAR*)&DllDatei[0])
ändere, kommt zwar keine Fehlermelding mehr, der Linker kann allerdings
auch mit LoadLibraryA nichts mehr anfangen.

Hat schon mal jemand Dlls mit zur Laufzeit erstellten Namen geladen und
kann mir helfen?

Gut wäre es auch wenn jemand die *.lib kennt, in der Loadlibrary
steht, damit ich sie dem Linker hinzufügen kann. Die MSDN konnte mir
zwar für alle möglichen CE versionen die lib sagen, aber nicht für
win32.

Gruß

bla

PS: Wenn ich testweise mit LoadLibrary(..., "name.dll") eine dll lade
geht es und der Linker nacht auch keine Probleme

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ich vermute mal irgendein Problem mit der Zeichenkodierung. Irgendwo in
den M$ Compileroptionen kann man einstellen wie ein String repräsentiert
wird (UTF8, Unicode usw.).

Matthias

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sofern Deine Anwendung nicht Unicode verwendet, ist es schlichtweg ein
Fehler, Strings in short-Arrays abzulegen.

Wenn Du also statt

  'unsigned short DllDatei[20]'

korrekt

  'TCHAR DllDatei[20]'

schreiben würdest, dann könntest Du auch die völlig unnötige
Arrayadressbestimmung beim Aufruf von LoadLibrary weglassen.

Das geht dann nämlich auch so:

    LoadLibrary(..., DllDatei)

und ist obendrein auch noch viel lesbarer.

Der vordefinierte Datentyp TCHAR wird abhängig von den Compileroptionen
wahlweise in einen Einzelbyte-Char oder aber in einen Unicode-Char
übersetzt.

Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe jetzt alles auf TCHAR umgestellt.

Der Linker Error bleibt allerdings. Auch eine direkte Angabe des
Namens geht nicht mehr, ohne dass ich an den Projekteinstellungen was
geändert habe.

Autor: Markus Volz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@bla
Unter den Embedded-Systemen (z.B. Windows Mobile für PDAs) geht nur
Unicode. D.h. bei einem String wird pro Zeichen 2 Bytes verwendet.
Damit Du unter Win32 keine Probleme bekommst, solltest Du Dein Projekt
auch auf Unicode einstellen (Menü Projekt -> Eigenschaften von
<Projekt>... -> Konfigurationseigenschaften / C/C++ / Präprozessor ->
Eigenschaft "Präprozessordefinitionen", dort ;_UNICODE anhängen). Ich
habe dazu mal einen Screen-Shot angehängt.

Ich bin übrigens etwas irritiert von Deinem LoadLibrary-Aufruf (
LoadLibrary(..., DllDatei) ). Laut MSDN wird sowohl bei LoadLibrary als
auch bei LoadLibraryEx als erster Parameter der DLL-Name als
(Unicode-)String-Pointer angegeben. Es könnte natürlich auch sein, daß
ich was übersehen habe...

Die Funktion LoadLibraryA ist die 1-Byte-Variante. Die Unicode-Version
ist LoadLibraryW. Hinter LoadLibrary verbirgt sich ein #define, der je
nach Projekteinstellung entweder zu LoadLibraryW oder LoadLibraryA
aufgelöst wird.

Wenn Du in den Projekteinstellungen bei Linker/Eingabe die Option
"Standardbibliotheken ignorieren" auf "nein" belassen hast, mußt Du
keine Windows-Standard-Library explizit dazulinken.

Beim Lesen aus einer Datei mit den C-Standard-Funktionen werden die
Zeichen i.d.R. in Byte-Strings geschrieben. Um Unicode-Strings zu
bekommen, mußt Du eine explizite Konvertierung von Byte nach Unicode
einbauen. Hierzu gibt es "Conversion Macros" und im MSDN einen
Artikel mit dem Titel "TN059: Using MFC MBCS/Unicode Conversion
Macros" (Suche nach "Conversion Macros").

Noch einen kleinen Tipp: hinter den Macros LPSTR, LPCSTR, LPWSTR,
LPCWSTR, LPTSTR und LPCTSTR steckt eine gewisse Systematik. "LP"
bedeutet long pointer, "STR" steht natürlich für string, in diesem
fall 0-terminiert, "C" für const, "W" für wide, also für
MBCS/Unicode, und "T" bedeutet entweder Byte- oder Wide-String, je
nach Einstellung über #define (im Projekt oder auch im Code).

Gruß
Markus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.