1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • [gelöst] Dll-Funktionen bekommen "Zusatz" (@8)

    • BugFix
    • 19. März 2011 um 02:43

    Hi,
    ich habe gerade meine ersten Gehversuche mit C++ gemacht.
    Es ist mir dann auch gelungen eine funktionierende Dll zu erstellen. (IDE: CodeBlocks, Kompiler: GNU GCC)
    Soweit ich gelesen habe, soll das Voranstellen von "extern "C" __declspec(dllexport) ..." dafür sorgen, dass ich die Funktionen in der Dll auch mit dem vergebenen Namen ansprechen kann.
    Es wird jedoch trotzdem an den Funktionsnamen "@8" angehängt, wobei die Zahl abhängig ist vom belegten Speicherplatz.
    Hier mal meine Test-Dll:

    main.h
    C
    #ifdef BUILD_DLL
    /* DLL export */
    #define EXPORT __declspec(dllexport)
    #else
    /* EXE import */
    #define EXPORT __declspec(dllimport)
    #endif
    
    
    #define WIN32_LEAN_AND_MEAN             // Selten verwendete Teile der Windows-Header nicht einbinden.
    
    
    // Windows-Headerdateien:
    #include <windows.h>
    
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    Alles anzeigen
    main.cpp
    Code
    #include "main.h"
    
    
    extern "C" {
    __declspec(dllexport) int _stdcall Addi (int,int);
    __declspec(dllexport) int _stdcall Multi (int,int);
    }
    
    
    __declspec(dllexport) int _stdcall Addi (int x1,int x2)
    {
    	int returnvar;
    	{
            returnvar=x1 + x2;
    	}
    	return returnvar;
    }
    
    
    __declspec(dllexport) int _stdcall Multi (int x1,int x2)
    {
    	int returnvar;
    	{
            returnvar=x1 * x2;
    	}
    	return returnvar;
    }
    Alles anzeigen


    Muß ich da noch weitere Angaben machen oder Kompilerdirektiven verwenden?

  • Chemieversuch: Elektrolyse Wasser

    • BugFix
    • 18. März 2011 um 22:28

    Nun, das zu Hause zu machen ist nicht ganz ungefährlich. Sauerstoff und Wasserstoff als Gase zusammengebracht sind natürlich ein explosives Gemisch. Also lieber Hände weg davon.

  • Interaktion mit Notepad++

    • BugFix
    • 18. März 2011 um 19:02

    progandy, du bist ein Schatz :love:
    Ich habe bei meinen Versuchenschon graue Haare bekommen. Jetzt kann ich endlich weiterbasteln. :thumbup:

    Edit: Hmm, ich bekomme keine Handle, alles 0x00000000 8|

    Edit2: Das DirectorWindow-Handle wird zurückgegeben, nur die anderen nicht.

    Ich hab das mal mit DependencyWalker angeschaut. 2 Dateien scheinen problematisch zu sein.Ist das die Ursache?

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Dateien

    nppdirector.png 115,79 kB – 0 Downloads
  • Interaktion mit Notepad++

    • BugFix
    • 18. März 2011 um 12:34

    Danke progandy, dann werde ich mal probieren das hinzubekommen.
    Vielleicht kann ich ja einfach ein vorhandenes Plugin dazu umfunktionieren.
    Ich melde mich hier, wenn ich ein Ergebnis habe. (Kann dauern, noch habe ich Null-Ahnung von C++ und Dll-Erstellung ;))

  • Fast schon peinliche Frage zu AutoIt / Scite

    • BugFix
    • 18. März 2011 um 11:38
    Zitat von Ynkelonium

    Ich hab eher das Gefühl dass die Installation unvollständig


    Das vermute ich auch.
    Bei der Installation die richtige Reihenfolge beachten!
    1. AutoIt Prod installieren
    2. [optional] AutoIt Beta installieren
    3. SciTE4AutoIt installieren (nicht das 'einfache' SciTE)

  • Interaktion mit Notepad++

    • BugFix
    • 18. März 2011 um 11:26

    Nach dem Lesen von unzähligen Dokus und Quelltexten bin ich auf die "PluginManager.dll" gestoßen. Diese enthält eine Funktion "setInfo" und bekommt als Parameter eine Struktur (NppData) mit 3 Handle übergeben.
    Das sieht dann so aus:

    Spoiler anzeigen
    [autoit]

    Local $tNppData = DllStructCreate( _
    "HWND _nppHandle;" & _
    "HWND _scintillaMainHandle;" & _
    "HWND _scintillaSecondHandle;")

    [/autoit] [autoit][/autoit] [autoit]

    Local $hDll = DllOpen(@ProgramFilesDir & "\notepad++\plugins\pluginmanager.dll")
    If @error Then
    Exit ConsoleWrite('DllOpen Error: ' & @error & @LF)
    Else
    ConsoleWrite('DllOpen: OK' & @LF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $ret = DllCall($hDll, 'int:cdecl', 'setInfo', 'ptr', DllStructGetPtr($tNppData))
    If @error Then Exit ConsoleWrite('DllCall Error: ' & @error & @LF)
    DllClose($hDll)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('_nppHandle: ' & DllStructGetData($tNppData, 1) & @LF)
    ConsoleWrite('_scintillaMainHandle: ' & DllStructGetData($tNppData, 2) & @LF)
    ConsoleWrite('_scintillaSecondHandle: ' & DllStructGetData($tNppData, 3) & @LF)

    [/autoit]

    Jedoch wird bei meinem Aufruf die Struktur nicht befüllt. Die Source für die pluginmanager.dll habe ich nicht finden können. Habe testweise statt 'ptr' mal 'int_ptr' verwendet, aber auch ohne Erfolg.
    Also der Dll-Call ist erfolgreich, kein Fehler und ein Return > 0.
    Nun hatte ich die Struktur als Fehlerquelle überprüft und dort mal "HWND" mit "HANDLE" ersetzt, auch ohne Erfolg.
    Im Moment gehen mir da die Ideen aus. :wacko:

  • Daten in ein .jar verpackten ordner schieber

    • BugFix
    • 17. März 2011 um 20:56

    Nimm zum Bsp. den Packer IZArc.
    Du öffnest den Explorer, Rechtsklick auf Datei die hinzugefügt werden soll, als Ziel die *.jar auswählen und OK. Schon ist sie hinzugefügt.

  • Erkennt AUTOIT nicht immer richtig den Inhalt von Variablen ?

    • BugFix
    • 17. März 2011 um 11:50
    Zitat von Ynkelonium

    Kann ich denn beeinflußen und wie, wie die Daten in einem Array gespeichert werden ?


    Ja, schau dir die Befehle: Number(), String().. etc. an.

  • Drag & Drop überprüfen

    • BugFix
    • 17. März 2011 um 11:04

    Zeig mal deinen bisherigen Code, sonst wird es ein Rätselraten. ;)

  • Interaktion mit Notepad++

    • BugFix
    • 17. März 2011 um 10:25

    Also das Abfragen des Scintilla Handle führt unweigerlich zum Crash von Notepad++. ;(
    Andere Aktionen, die das Scintilla-Handle nicht benötigen, funktionieren problemlos:

    Spoiler anzeigen
    [autoit]

    #Include <SendMessage.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local Const $WM_USER = 0x400
    Local Const $NPPMSG = $WM_USER + 1000

    [/autoit] [autoit][/autoit] [autoit]

    Local Const $NPPM_GETCURRENTSCINTILLA = ($NPPMSG + 4)
    Local Const $NPPM_GETCURRENTDOCINDEX = ($NPPMSG + 23)
    Local Const $MAIN_VIEW = 0
    Local Const $SUB_VIEW = 1
    Local Const $NPPM_GETMENUHANDLE = ($NPPMSG + 25)
    Local Const $NPPM_ACTIVATEDOC = ($NPPMSG + 28)
    ;~ void $NPPM_ACTIVATEDOC(int view, int index2Activate)
    Local Const $NPPM_GETWINDOWSVERSION = ($NPPMSG + 42)
    ;~ winVer $NPPM_GETWINDOWSVERSION(0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hNpp = WinGetHandle('[CLASS:Notepad++]')

    [/autoit] [autoit][/autoit] [autoit]

    ; Index (0-basiert des aktuellen Dokuments) ==> funktioniert
    Local $iDocIndex = _SendMessage($hNpp, $NPPM_GETCURRENTDOCINDEX)
    ConsoleWrite('@@ DEBUG_Line: ' & @ScriptLineNumber & ', Var: $iDocIndex >> ' & $iDocIndex & ' ; @error: ' & @error & ', @extended: ' & @extended & @LF) ; Debug To Console

    [/autoit] [autoit][/autoit] [autoit]

    ; Dokument vor dem aktuellen aktivieren ==> funktioniert
    Local $ret = _SendMessage($hNpp, $NPPM_ACTIVATEDOC, $MAIN_VIEW, $iDocIndex-1)
    ConsoleWrite('@@ DEBUG_Line: ' & @ScriptLineNumber & ', Var: $ret >> ' & $ret & ' ; @error: ' & @error & ', @extended: ' & @extended & @LF) ; Debug To Console

    [/autoit] [autoit][/autoit] [autoit]

    ; Menü-Handle abfragen ==> funktioniert
    $hMenu = _SendMessage($hNpp, $NPPM_GETMENUHANDLE)
    ConsoleWrite('@@ DEBUG_Line: ' & @ScriptLineNumber & ', Var: $hMenu >> ' & $hMenu & ' ; @error: ' & @error & ', @extended: ' & @extended & @LF) ; Debug To Console

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================
    ; Scintilla-Handle abfragen ==> Exception Error !
    Local $hScintilla = _SendMessage($hNpp, $NPPM_GETCURRENTSCINTILLA)
    ConsoleWrite('@@ DEBUG_Line: ' & @ScriptLineNumber & ', Var: $hScintilla >> ' & $hScintilla & ' ; @error: ' & @error & ', @extended: ' & @extended & @LF) ; Debug To Console

    [/autoit]


    Ich bekomme einen Exception Error und NPP bietet dann an, einen Dump zu speichern, was dann im Crash endet mit unzähligen Fenstern "Visual C++ Runtime Error".

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Dateien

    NppExceptionErr.png 27,95 kB – 0 Downloads NppRuntimeErr.png 27,9 kB – 0 Downloads
  • Interaktion mit Notepad++

    • BugFix
    • 16. März 2011 um 17:52

    Danke progandy, dann werde ich dort mal weiterlesen.

  • Notepad++ und AutoIt

    • BugFix
    • 16. März 2011 um 17:48

    Im Moment bastel ich an den Grundlagen um Abbrev und Autovervollständigung realisieren zu können.
    Wenn du was übernehmen möchtest, warte vielleicht etwas, bis ich die Interaktion im Griff habe. Ohne das geht keines der beiden Probleme. Ich überlaß dir dann aber gern die Autovervollständigung. Abbrev-Management habe ich ja bereits mal gemacht und werde es hierfür umgestalten.

  • Interaktion mit Notepad++

    • BugFix
    • 15. März 2011 um 23:34

    Hi,
    ich bastel ja gerade an der Verwendung von Notepad++ als AutoIt-Editor.
    Nun benötige ich Interaktionen mit dem NPP-Fenster (Scintilla-Edit-Control). Scintilla verwendet einen eigenen Adressraum, somit kann man nicht mit WM_GETTEXT und WM_SETTEXT arbeiten. Dazu gibt es von Scintilla eigene Messages.
    Ich habe jetzt mal ein Skript nachgestellt um den Text des aktuell offenen NPP-Fensters auszugeben. Aber schon die Abfrage der Textlänge bleibt ohne Erfolg.

    [autoit]

    #Include <SendMessage.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $Wnd = WinGetHandle('[CLASS:Notepad++]'), $Len
    $Len = _SendMessage($Wnd, 2183, 0, 0) ; Rückgabe '0', kein Fehler

    [/autoit]


    Hat jemand eine Idee?

  • Notepad++ und AutoIt

    • BugFix
    • 15. März 2011 um 19:08

    Ja, ist mir auch aufgefallen ;)
    Habe das jetzt abgefangen und ein Skript erstellt, das wahlweise Ausgabe in Konsole oder MsgBox erstellt.
    Werde es gleichmal im ersten Post aktualisieren.


    Edit:
    Habe wohl noch einen Bug in der Variablenerkennung (Debug). Einige Kombinationen werden nicht richtig erkannt.
    Falls ihr auch was findet sagt Bescheid.

    Ahh.. >> Ich muß vor der Auswertung die Tabs in Zeichen umwandeln, dann paßt es. ;)
    Werde ich gleich mal ändern.

  • Notepad++ und AutoIt

    • BugFix
    • 15. März 2011 um 16:02

    Neu: Debug To Console

  • Array vs. mySQL

    • BugFix
    • 15. März 2011 um 10:21
    Zitat von Techmix

    Wie gesagt ich suche nache einer 'schnellen' Datenbankabfrage


    Bist du dir da sicher? Eine Datenbankabfrage lautet z.B. (als Pseudo-Abfrage):
    Suche: KDNR, Name, Adresse, Telefonnummer
    von: Tab_Kunden, Tab_Umsatz
    wenn: Tab_Kunden.KDNR = Tab_Umsatz.KDNR und JahrVon(Tab_Umsatz.DATUM) = 2010
    sortiert nach: KDNR
    Dabei ist eine SQL-Datenbank unschlagbar. Als reinen Datenspeicher würde ich eine SQL-DB nicht mißbrauchen.

  • Fragen zu SciTE

    • BugFix
    • 15. März 2011 um 10:07

    Oder du nutzt Notepad++ als AutoIt-Editor.
    Das Konsolen-PlugIn verhält sich genau so, wie du es willst. ;)

  • Array vs. mySQL

    • BugFix
    • 15. März 2011 um 09:30

    Es kommt drauf an, was du mit den Werten anfangen willst. Eine komplexe SQL-Abfrage auf Array-Ebene umzusetzen ist sicher wesentlich zeitintensiver.
    Wie gesagt: Der Verwendungszweck ist hier entscheidend.
    Und warum MySQL? SQLite ist doch auch eine prima Alternative und bereits in AutoIt integriert.

  • Fragen zu SciTE

    • BugFix
    • 15. März 2011 um 07:40

    Ich habe mir bisher noch nicht angesehen, wie die Konsole angesteuert wird. Ich vermute aber, dass du hier mit LUA oder SciTECommands weiterkommst.
    Hier mal der SciTECommands-Part aus Xenos OrganizeIncludes:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Description: Sending commands to SciTE interface
    ;===============================================================================
    Func SendSciTE_Command($sCmd, $Wait_For_Return_Info = 0)
    Local $WM_COPYDATA = 74
    Local $WM_GETTEXT = 0x000D
    Local $WM_GETTEXTLENGTH = 0x000E224
    Local Const $SCI_GETLINE = 2153
    Local $Scite_hwnd = WinGetHandle('DirectorExtension') ; Get SciTE DIrector Handle
    Local $My_Hwnd = GUICreate('AutoIt3-SciTE interface') ; Create GUI to receive SciTE info
    Local $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2)) ; Convert my Gui Handle to decimal
    $sCmd = ':' & $My_Dec_Hwnd & ':' & $sCmd ; Add dec my gui handle to commandline to tell SciTE where to send the return info
    ;~ ConsoleWrite('SciTE Command --> ' & $sCmd & @LF)
    Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
    DllStructSetData($CmdStruct, 1, $sCmd)
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
    DllStructSetData($COPYDATA, 1, 1)
    DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
    DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
    DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
    'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
    'Ptr', DllStructGetPtr($COPYDATA))
    GUIDelete($My_Hwnd)
    EndFunc ;==>SendSciTE_Command
    ;===============================================================================
    ; Description: Sending commands to SciTE interface
    ;===============================================================================
    Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
    Local $SciTECmdLen = DllStructGetData($COPYDATA, 2)
    Local $CmdStruct = DllStructCreate('Char[255]', DllStructGetData($COPYDATA, 3))
    $SciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $SciTECmdLen)
    EndFunc ;==>MY_WM_COPYDATA

    [/autoit]

    Das könnte dir als Ansatz helfen. Mußt 'nur' noch die erforderlichen Kommandos finden. (Scintilla Dokumentation)

  • AutoBot initalisiert...

    • BugFix
    • 14. März 2011 um 22:48

    Willkommen.
    Aber mit deinem Nick hast du dir echt keinen Gefallen getan. Bots mögen wir, wie der Teufel das Weihwasser. :whistling:

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™