linkfehler bei keybd_event()



  • hallo @all

    ich habe ein Problem mit einer Klasse ...^^
    DIe Klasse Definiert eine Funktion, die aus einem System::String Objekt ein char-Arry macht und dieses dann mit keybd_event() 'schreibt'.
    hier mal der Code:

    #include <windows.h>
    
    using namespace System;
    
    namespace{
    static void virt_write(char buchstabe)
    {
    	keybd_event(buchstabe , 0, 0, NULL);
    	keybd_event(buchstabe , 0, KEYEVENTF_KEYUP, NULL);
    }
    }
    
    //ein paar andere, unwichtige sachen...
    
    public ref class key_event
    {
    static int write(System::String ^text)
    		{
    			try{
    			array<wchar_t> ^buchstaben;
    			buchstaben=text->ToCharArray();
    			for each (char buchstabe in buchstaben)
    			{
    				virt_write(buchstabe);
    			}
    			}catch(Exception ^e)
    			{
    				return 1
    			}
    			return 0;
    		}
    };
    

    Beim Compilieren werden nun folgende Fehler angezeigt:

    1>mylib.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""extern "C" 
    void __stdcall keybd_event(unsigned char,unsigned char,unsigned long,unsigned 
    long)" (?keybd_event@@$$J216YGXEEKK@Z)".
    1>C:...\mylib.dll : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    

    Ich weiss auch, dass das nicht sehr sinnvoll ist aber ... man kann es ja mal brauchen 😃

    Ich würd mich über Ratschläge o.ä. freuen. Wenn es dieses Thema schon gibt bitte einen Link.

    Danke 😃



  • Du musst halt die entsprechende lib, die das keybd_event enthält hinzulinken.
    Ich weiß nicht wie die lib heißt, das sollte aber in deiner Doku stehen.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hier noch der Link zur Doku:
    http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx

    Die Library heisst User32.lib



  • super Idee danke 😃 jetzt sind die LNK-Fehler weg erhalte aber ein paar neue also meine Klasse sieht jetzt so

    #include <windows.h>
    //User32.lib ist gelinkt
    using namespace System;
    
    [DllImport("user32.dll", EntryPoint="keybd_event", CharSet=CharSet::Auto,
    ExactSpelling=true)]
    static extern void keybd_event(byte vk, byte scan, int flags, int extrainfo);
    //hier bekomme ich einen Fehler: error C2159: Mehr als eine Speicherklasse
    //angegeben (denke es liegt an `static void´)
    
    namespace{
    static void virt_write(char buchstabe)
    {
        keybd_event(buchstabe , 0, 0, NULL);
        keybd_event(buchstabe , 0, KEYEVENTF_KEYUP, NULL);
    }
    }
    
    //ein paar andere, unwichtige sachen...
    
    public ref class key_event
    {
    static int write(System::String ^text)
            {
                try{
                array<wchar_t> ^buchstaben;
                buchstaben=text->ToCharArray();
                for each (char buchstabe in buchstaben)
                {
                    virt_write(buchstabe);
                }
                }catch(Exception ^e)
                {
                    return 1
                }
                return 0;
            }
    };
    

    aus.
    Die Fehler sind:

    1>error C2159: Mehr als eine Speicherklasse
    1>error C2666: 'keybd_event': 2 Überladungen haben ähnliche Konvertierungen
    1>  kann 'void keybd_event(byte,byte,int,int)' sein
    1>  oder "void keybd_event(BYTE,BYTE,DWORD,ULONG_PTR)"
    1>  bei Anpassung der Argumentliste '(BYTE, int, DWORD, int)'
    

    Freu mich über weitere Hilfe



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum WinAPI in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Deine Probleme könntest Du auch umgehen, indem Du in einer Welt bleibst (z.B. der managed) und die dafür gedachten Mechanismen benutzt.

    Benutze doch die Klasse SendKeys, anstatt keybd_event(..)
    http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx

    Ausserdem ist die P/Invoke Deklaration in C++/CLI nicht nötig. Es hätte gereicht, dem Linker die User32.lib bekanntzumachen.

    Aber wie gesagt, Entscheide dich ob managed oder nicht und suche entsprechende Lösungen. Es ist in dem meisten Fällen nicht nötig managed und unmanaged zu mischen.

    Simon



  • ich wusste garnet dass diese Klasse überhaupt gibt 😕 jetzt geht es

    VIELEN DANK 😃 😃 😃


Log in to reply