error C2664: 'CreateFileW' ...



  • Hallo,

    bin gerade dabei mir ein Programm zu schreiben (d.h. woanders Code heraus kopieren), welches mit der Com-Schnittstelle kommunizieren soll. Scheitere aber schon am Anfang. Ich erhalte folgende Fehler:

    1>c:\dokumente und einstellungen\user\eigene dateien\visual studio 2008\projects\projekt_com1\projekt_com1\hauptprog.cpp(128) : error C2664: 'CreateFileW': Konvertierung des Parameters 1 von 'char [10]' in 'LPCWSTR' nicht möglich
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    Der Quelltext:

    ...

    HANDLE hCom;
    static char comm[10]="COM2";

    ...

    hCom = CreateFile(comm,
    GENERIC_READ | GENERIC_WRITE,
    0, // comm devices must be opened w/exclusive-access
    NULL, // no security attrs
    OPEN_EXISTING, // comm devices must use OPEN_EXISTING
    0, // not overlapped I/O
    NULL // hTemplate must be NULL for comm devices
    );

    ...

    Hat jemand eine Idee, wie ich den Fehler beheben kann?

    Grüße und Danke im Voraus

    datatom



  • Die einfachste Lösung: schalte in den Projekteinstellungen von Unicode auf MBCS um.


  • Mod

    Ein char ist eben kein wchar_t!
    Wie wäre es mit etwas Grundlagenstudium?
    Du hast ein Unicode Projekt. Dann wollen die meisten API Funktionen eben auch Unicode Strings!

    Also T-Notation benutzen:

    static TCHAR comm[10]=_T("COM2");
    

    1. Warum static?
    2. Warum gibt Du eine Länge an?

    Das genügt:

    TCHAR comm[]=_T("COM2");
    


  • Habe den Zeichensatz des Projektes auf "Multi-Byte-Zeichensatz verwenden"
    umgestellt. Bekomme nun folgenden Fehler:

    1>------ Erstellen gestartet: Projekt: Projekt_com1, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>Hauptprog.cpp
    1>Manifest in Ressourcen wird kompiliert...
    1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
    1>Copyright (C) Microsoft Corporation. All rights reserved.
    1>Verknüpfen...
    1>MSVCRTD.lib(crtexew.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WinMain@16" in Funktion "___tmainCRTStartup".
    1>C:\Dokumente und Einstellungen\User\Eigene Dateien\Visual Studio 2008\Projects\Projekt_com1\Debug\Projekt_com1.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Habe aber auch die andere Variante mit der T-Notation ausprobiert

    ...
    TCHAR comm[]=_T("COM2");
    ...
    hCom = CreateFile(comm,
    GENERIC_READ | GENERIC_WRITE,
    0, // comm devices must be opened w/exclusive-access
    NULL, // no security attrs
    OPEN_EXISTING, // comm devices must use OPEN_EXISTING
    0, // not overlapped I/O
    NULL // hTemplate must be NULL for comm devices
    );
    ...

    und erhalte folgenden Fehler (Unicode-Zeichensatz):

    1>------ Erstellen gestartet: Projekt: Projekt_com1, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>Hauptprog.cpp
    1>c:\dokumente und einstellungen\user\eigene dateien\visual studio 2008\projects\projekt_com1\projekt_com1\hauptprog.cpp(10) : error C3861: "_T": Bezeichner wurde nicht gefunden.
    1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\User\Eigene Dateien\Visual Studio 2008\Projects\Projekt_com1\Projekt_com1\Debug\BuildLog.htm" gespeichert.
    1>Projekt_com1 - 1 Fehler, 0 Warnung(en)

    Wer hat eine Idee?

    PS: Wie markiert man den Text, wie es Martin Richter getan hat?



  • Habe bei der Version T-Notation tchar.h eingefügt und der Fehler error C3861: "_T": Bezeichner wurde nicht gefunden. ist verschwunden.

    Erhalte aber nun folgenden Fehler:

    1>MSVCRTD.lib(crtexew.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WinMain@16" in Funktion "___tmainCRTStartup".
    1>C:\Dokumente und Einstellungen\User\Eigene Dateien\Visual Studio 2008\Projects\Projekt_com1\Debug\Projekt_com1.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Wer hat eine Idee?


  • Mod

    Du hast Deine Projket als Windows Programm erzeugt, aber Du hast ein Konsolen Programm als Sourcecode.

    Linker Optionen ändern.

    BTW: Du findest zu dieser fehlermeldung genug Artikel in diesem Forum. 👎



  • datatom schrieb:

    PS: Wie markiert man den Text, wie es Martin Richter getan hat?

    Schließ deinen Code in [cpp] und [/cpp] ein (dazu kannst du den C/C++-Button unter den Smiley benutzen, oder es halt selber notieren).



  • Ich schätze mal, dass die Include-Dateien nicht für ein Windowsprogramm sind sondern für eine Konsolenanwendung, oder? 😕

    Das heißt auch, dass ich die Funktionen, die ich nicht für mein Hauptfenster brauche, in eine Konsolenanwendung stecke und sie dann aus dem Windowsprogramm meines Hauptfensters aufrufe, oder? 😕



  • Das hat nix mit include-Dateien/Headern zu tun. Der Linker sucht eine Funktion WinMain (du hast beim Erstellen des Projekts Win32-Anwendung angegeben). Du hast nun aber vor, eine Konsolenanwendung zu schreiben und notierst stattdessen die Funktion main. Alles was du tun musst, ist das in den Projektsettings zu korrigieren.



  • Danke an alle. Werde das Gelernte jetzt mal anwenden:-)


Anmelden zum Antworten