WinAPI Message Funktionen mit C++/CLI aufrufen



  • Hi,
    Ich versuche mit C++/CLI SendMessage und FindWindow zu verwenden.
    Nach dem was ich bisher gelesen habe ist bei C++/CLI Invoking nicht nötig,
    die Funktionen können angeblich einfach verwendet werden.
    Ich hab also einfach ein neues CLR WinForms Projekt erstellt und die Windows.h included.

    Um genau zu sein sieht das ganze so aus

    #pragma once
    
    #include <iostream>
    #include <windows.h>
    
    using namespace System;
    
    namespace MessageSys 
    {
    	public ref class MessageHandling
    	{
    	public:
    		static void SendMessageToUnmanaged()
    		{
    			HWND hWnd = ::FindWindow(nullptr, L"Fenstername");
    
    			// in windows h deklariert
    			//int WM_APP;
    		        //WM_APP = 0x8000;
    
                		unsigned int WM_MYMSG;
    			WM_MYMSG = WM_APP + 0x100;
    
    			String ^message = "Hello world";
    			array<Byte> ^stringBytes = System::Text::Encoding::ASCII->GetBytes(message);
    			pin_ptr<Byte> pStringBytes = &stringBytes[0];
    			const char *szByte = reinterpret_cast<const char *>(pStringBytes);
    			std::string sMessage(szByte, stringBytes->Length);
    
    			::SendMessage( hWnd, WM_MYMSG, 0, reinterpret_cast<LPARAM>(sMessage.c_str()) );
    		}
    
    	};
    
    }
    

    Diese Funktion soll einen Standard C String per WinMessage versenden. Ich bekomme allerdings die Fehlermeldungen

    error LNK2001: Nicht aufgelöstes externes Symbol ""extern "C" long __stdcall SendMessageW(struct HWND__ *,unsigned int,unsigned int,long)"

    error LNK2001: Nicht aufgelöstes externes Symbol ""extern "C" struct HWND__ * __stdcall FindWindowW(wchar_t const *,wchar_t const *)"

    Ich nehme an ich muss eine Dll einbinden – aber welche, und wie?

    mfg,
    Vielen Dank



  • Ich nehme an ich muss eine Dll einbinden – aber welche, und wie?

    http://msdn.microsoft.com/en-us/library/ms633499.aspx
    http://msdn.microsoft.com/en-us/library/ms644950.aspx

    Header, Lib und Dll stehen in der angegebenenen Doku.

    Simon



  • Per default sind die entsprechenden Libs nicht dazugelinkt.
    Die entsprechenden Funktionen befinden sich in der User32.lib.

    Es gibt mindestens zwei Lösungen:
    1. Aktiviere bei den Project Settings > Linker > Input > Additional Dependencies den "Inherit from parent or project defaults" ODER enteferne dort das $(NoInherit) Flag.
    2. Gib die Abhängigkeit wie folgt im Source Code an:

    #pragma comment(lib, "user32.lib")
    

    Simon


Anmelden zum Antworten