Autor Thema: SendMessage - String zwischen 2 Anwendungen austauschen  (Gelesen 3092 mal)

Offline Noteip

  • Frischling
  • *
  • Beiträge: 8
Hallo Notes-User, Admins und Entwickler,

ich steh mal wieder vor einem Problem.

Ich habe ein kleines Programm, dem man per WM_COPYDATA Befehle rüberschieben kann und diese werden dann abgearbeitet.

Bis jetzt ist es so, dass ich eine kleine Delphi-DLL hab, welche von Notes angesprochen wird und den String übergibt. (Das funktioniert auch ohne Probleme.)

Nun ist es aber so, dass ich jedesmal sicherstellen muss, dass der User die DLL hat und diese auch aufgerufen werden kann.

Also dachte ich mir, dass man das ganze Zeug aus der DLL in LS neu schreibt (ist nicht viel, nur 1 Funktion) und die DLL somit überflüssig wird. (so dachte der kleine Markus)

Mein Problem sind die 2 Funktionen (FindWindow, SendMessage) und die Struktur COPYDATASTRUCT.

Zu den zwei Funktionen hab ich hier im Forum schon die passenden Deklarationen gefunden. Mein Problem ist, wie ich folgenden Delphi Code in LS umsetzen kann.

Code
hTargetWnd = FindWindow(nil,PChar('MyTestApp'))

function SendTextToWnd(hTargetWnd: HWND; Text : PChar): boolean;
var
  MyCopyDataStruct: TCopyDataStruct;
begin
  Result := true;
  try
    // TCopyDataStruct mit den Sende-Daten Infos ausfüllen
    with MyCopyDataStruct do
    begin
      dwData := 0;
      cbData := StrLen(Text) + 1;
      lpData := Text
    end;
    // Die Struktur an den Empfänger schicken
    if hTargetWnd <> 0 then
    	SendMessage(hTargetWnd, WM_COPYDATA, Longint(0), Longint(@MyCopyDataStruct));
  except
    Result := false;
  end;
end;

Die C-Definition der Struktur ist folgende:
Code
typedef struct tagCOPYDATASTRUCT {
    ULONG_PTR dwData;
    DWORD cbData;
    PVOID lpData;
}

Mein größtes Problem liegt darin, den String der Struktur zuzuordnen.

Mein bisherigen Versuche sahen so aus:
Code
Private Type COPYDATASTRUCT
	dwData As Long
	cbData As Long
	lpData As Long
End Type

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (Byval lpClassName&, Byval lpWindowName As String) As Long
Declare Function SendMessage Lib "user32.dll" (Byval hWnd As Long, Byval Msg As Long, Byval wParam As Long, lParam As Long) As Long


Keine Ahnung, wie das gehen soll :-:

Danke schonmal für eure Hilfe.

ps. Notes R5.0.11
« Letzte Änderung: 05.04.06 - 14:05:33 von Noteip »
Clients: 7.0.2, 7.0.3, 8.0.2, 8.5.2
Server: 8.0.2

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: SendMessage - String zwischen 2 Anwendungen austauschen
« Antwort #1 am: 06.04.06 - 08:32:52 »
Hallo Markus,

hast du schon mal mit LS bzw. Visual Basic gearbeitet?

Toni
Grüßle Toni :)

Offline Noteip

  • Frischling
  • *
  • Beiträge: 8
Re: SendMessage - String zwischen 2 Anwendungen austauschen
« Antwort #2 am: 06.04.06 - 10:42:34 »
Guten Morgen Toni,

eigentlich schon, hab schon etliche Sachen in LS realisiert (Telefon-Steuerung, automatische Exporte per Mail, Excel, usw.), aber noch nie mit der WinAPI gearbeitet.
Clients: 7.0.2, 7.0.3, 8.0.2, 8.5.2
Server: 8.0.2

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: SendMessage - String zwischen 2 Anwendungen austauschen
« Antwort #3 am: 06.04.06 - 11:41:26 »
wenn du mal nach deinen Funktionsnamen/Strukturnamen zusammen mit dem Begriff VB in google suchst, dann könntest du Hilfe finden.
Da VB und LS sehr ähnlich sind kannst du die gefundenen Codebeispiele meistens recht bequem nach LS übertragen
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Noteip

  • Frischling
  • *
  • Beiträge: 8
Re: SendMessage - String zwischen 2 Anwendungen austauschen
« Antwort #4 am: 06.04.06 - 14:42:35 »
Nun komm ich tatsächlich nicht mehr weiter ...

So sieht meine aktuelle Situation aus:
Code
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (Byval lpClassName&, Byval lpWindowName As String) As Long

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, Byval cbCopy As Long)

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (Byval hwnd As Long, Byval wMsg As Long, Byval wParam As Long, lParam As Any) As Long

Private Type COPYDATASTRUCT
	dwData As Long
	cbData As Long
	lpData As Long
End Type

Const WM_COPYDATA = &H4A

Function SendData(Mode&, Data$) As Long
	Dim DesthWnd As Long
	Dim B(0 To 2048) As Integer
	Dim CD As COPYDATASTRUCT
	
	DesthWnd = FindWindow(0, "RecvWMCOPYDATA")
	If DesthWnd = 0 Then
		Msgbox ("AlphaCTI nicht gestartet! Bitte zuerst starten!")
	Else
		CD.dwData = Mode
		Select Case Mode
		Case 1: SendData = True 'String senden
			Call CopyMemory(BArray(0), Byval Data, Len(Data))
			CD.cbData = Len(Data) + 1
			CD.lpData = B(0)
		Case 2: SendData = True 'MsgBox anzeigen lassen
		Case 3: SendData = True 'Anderen Prozeß sich selbst
                                    'schließen lassen
		End Select
		
		If SendData Then
			Call SendMessage(DesthWnd, WM_COPYDATA, 0, CD)
		End If
	End If
End Function

Mein Problem ist nun, dass ich B nicht als "Byte" definieren kann und zum 2. die Funktion VarPtr() nicht existiert.

Der VB-Code sieht folgendermaßen aus:
Code
Private Function SendData(Mode&, Optional Data$) As Boolean
    Dim DesthWnd As Long, B(0 To 255) As Byte
    Dim CD As COPYDATASTRUCT
    
    DesthWnd = FindWindow(vbNullString, "Destination")
    If DesthWnd = 0 Then
        MsgBox ("Das Zielfenster wurde nicht gefunden" & vbCrLf & _
                "Bitte Starten sie erst das andere Projekt!")
    Else
        CD.dwData = Mode
        Select Case Mode
            Case 1: SendData = True 'String senden
                Call CopyMemory(B(0), ByVal Data, Len(Data))
                CD.cbData = Len(Data) + 1
                CD.lpData = VarPtr(B(0))
                
            Case 2: SendData = True 'MsgBox anzeigen lassen
            Case 3: SendData = True 'Anderen Prozeß sich selbst
                                    'schließen lassen
        End Select
        
        If SendData Then Call SendMessage(DesthWnd, WM_COPYDATA, _
                                        Me.hwnd, CD)
    End If
End Function
(Source stammt von http://www.activevb.de/tipps/vb6tipps/tipp0337.html)

Wäre nett, wenn mir einer von euch helfen könnte.
Clients: 7.0.2, 7.0.3, 8.0.2, 8.5.2
Server: 8.0.2

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Re: SendMessage - String zwischen 2 Anwendungen austauschen
« Antwort #5 am: 06.04.06 - 16:53:55 »
Das mit dem Byte sollte kein Problem sein (Aber heisst es nicht B(0 to 255?).

Hingegen mit dem VarPtr wirst du Schwierigkeiten bekommen. Diese Funktion gibt einen Pointer auf eine Variabel zurück (Nur VB5 und 6, und das auch noch undokumentiert!).

Vielleicht gibts eine ähnliche Funktion in LS (ist mir aber nicht bekannt...). Umgehen kann man die glaubich nicht, da dies ja der Kern der Funktion ist (habs aber nicht im Detail angeschaut).

Gibt es denn keine andere Möglichkeit den String auszutauschen?

Grüsse
Moritz

Offline Noteip

  • Frischling
  • *
  • Beiträge: 8
Re: SendMessage - String zwischen 2 Anwendungen austauschen
« Antwort #6 am: 06.04.06 - 23:02:05 »
Leider nein, aber vielleicht find ich ja noch einen Weg. Ansonsten muss ich halt doch mit DLL arbeiten.

Dank dir ;)
Clients: 7.0.2, 7.0.3, 8.0.2, 8.5.2
Server: 8.0.2

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: SendMessage - String zwischen 2 Anwendungen austauschen
« Antwort #7 am: 07.04.06 - 08:24:35 »
Wenn das mit der DLL funktioniert, würde ich das so lassen.

Was das Sicherstellen der Verfügbarkeit der DLL angeht, mach doch folgendes. Erstelle dir ein Dokument mit einem RTF-Feld in der DB und hänge dort die DLL-Datei rein. Im Datenbank-Script prüfst du beim Öffnen der DB ob die Datei vorhanden ist. Wenn nicht löst du sieeinfach in das entsprechende Verzeichnis.


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz