Seite 1 von 1
Speicherbereich für alle?
Verfasst: 18.10.2004 17:49
von strgalt
Naben zusammen,
Ich möchte mit Prog A etwas in den Speicher schreiben, und es per Pointer oder eben Adresse mit Prog B wieder auslesen.
Hab auch schon im Archiv gesucht, wurde aber nicht weiter ausgeführt, da in diesem Fall ein SendMessage_() ausreichte. Fällte bei mir aber flach.
Vielleicht hat ja jemand eine Idee.
Mit Dank im Voraus
Verfasst: 18.10.2004 19:08
von GPI
Fragmente aus jaPBe:
Senden
Code: Alles auswählen
Procedure SendData(ziel,Type,adr,len)
cd.COPYDATASTRUCT
cd\dwData=Type
cd\cbData=len
cd\lpData=adr
ProcedureReturn SendMessage_(ziel,#WM_COPYDATA,MainWin,cd)
EndProcedure
Empfangen (in windowcallback)
Code: Alles auswählen
case #WM_COPYDATA
*cd.COPYDATASTRUCT=lParam
Result=#False
Select *cd\dwData
Case #WMCD_InsertText
SCI_BeginUndoAction()
SCIReplaceText(SCI_GetSelectionStart(),SCI_GetSelectionEnd(),*cd\lpData,#True)
Pos=SCI_GetCurrentPos()+*cd\cbData-1
SCI_GotoPos(Pos)
ColorWordUnderCursor=#True
ColoringLine(#True,-1,SCI_LineFromPosition(Pos))
ColorWordUnderCursor=#False
If AutoInsert=#True
;SCI_SetAnchor(Pos)
StartLine=SCI_LineFromPosition(Pos-*cd\cbData-1)
EndLine=SCI_LineFromPosition(Pos)
If StartLine<EndLine
ChangeIndentationLines(StartLine-1,EndLine)
EndIf
EndIf
SCI_EndUndoAction()
Result=#True
Case #wmCD_ReplaceCompleteText
NoFoldChangeProtection=#True
SCI_SetText(*cd\lpData)
NoFoldChangeProtection=#False
SCI_GotoPos(*cd\cbData-1)
Result=#True
Case #wmcd_ReplaceCurrentLine
line=SCI_LineFromPosition(SCI_GetCurrentPos())
SCIReplaceText(SCI_PositionFromLine(line),SCI_GetLineEndPosition(line),*cd\lpData,#True)
SCI_GotoPos(SCI_GetLineEndPosition(line))
Result=#True
Case #wmcd_NewText
NeedFreePanel()
SCI_SetText(*cd\lpData)
SCI_GotoPos(*cd\cbData-1)
Result=#True
Case #WMCD_OpenFile
;{Datei öffnen
If *cd\lpData
autoload$= PeekS(*cd\lpData,*cd\cbData)
LoadSourceCodeReal(autoload$)
AddRecentFile(autoload$)
SetForegroundWindow_(MainWin)
EnableWindow_(MainWin,#True)
If IsZoomed_(MainWin)
ShowWindow_(MainWin, #SW_MAXIMIZE)
Else
ShowWindow_(MainWin, #SW_RESTORE)
EndIf
Result=#True
EndIf
;}
EndSelect
Result=#True
Verfasst: 19.10.2004 00:01
von strgalt
Hallo,
ja, dass mit SendMessage is mir klar. Leider geht das nicht. Die Daten die ich da verschiffen will sind zu viele (können bis zu 700 000 Datensätze a 17 Felder sein). Außerdem spielt die WinProc da nicht mehr mit..... ääää, ist so, dass Prog A dann mitteilen muss ob es die Daten abgearbeitet hat und muss neue anfordern. Dann schickt Prog B wieder Daten rüber usw... Da hängts dann, weil zwischenher auch noch einiges gemacht wird. Die WinProc machte mit der SendMessage schon hier Probs, so dass ich schon mit PostMessage knallen muss.
Es geht leider nicht anders... ich muss von Prog A auf eine Adresse zugreifen, die ich in Prog B per GlobalAlloc - oder per PB - alloc. habe.
Ich hätt´s auch lieber ohne den ganzen Zinover, aber
1. kann PB zum einen nichteinmal auf 2 Stellen nachkommer richtig rechnen geschweige runden,
2. gibts kein Double, denn ich für einen Timestamp vom SQL- Server zu weiteren Berechnungen dringend brauche und
3. müssen die Daten eigentlich in Excel. XML langt für meine Sache nicht aus weil ich im Sheet Falten verwende, und auf die Excel- Lib kann man ja nicht zugreifen.
Also muss ich die Daten von PB nach VB verschieben, dort Pipifaxberechnungen vornehmen, die PB nicht kann (und wenns nur Kostenberechnungen sind), und von VB gehts halt dann weiter nach Excel.
Und wenn PB wenigstens nen Float und keinen Loati hätte, dann würde ich mich wahrscheinlich noch mit der Zwischenablage zufrieden geben... aber naja, mal guggen, wie lange Fred da noch drummherum redet "dass währe halt überall und immer so"... ja klar bei einer Genauigkeit von 4 B is mir das schon klar - ein Wohl auf QB und GW, die konnten das schon vor 20 Jahren.
Aber vielleicht fällt Dir (oder gerne auch Euch) ja zu dem ein oder anderem noch was ein... muss doch was geben, mit dem ich in der Lage bin, auf einen Speicherbereich zuzugreifen, der in einem anderen Programm alloc. wurde.
Verfasst: 19.10.2004 08:32
von Rings
mittels der process-library von mir isses möglich auf andere Programme Speicher zuzugreifen.
In Vb kannst du den allokieren und per Sendmessage den zeiger transferieren.
ach, wenn excel ne COM-DLL bereitstellt (und das macht sie) um auf ihre spalten/Zeilen etc. zuzugreifen, dann kann man auch mit PB darankommen. Such mal nach dem COM-IMPORTER von AXEND, irgendwo gibts da auch ein excel-gerüst:
http://purebasic.myforums.net/viewtopic.php?t=11031
Verfasst: 19.10.2004 18:53
von strgalt
@Rings
ja, dass währe schon mal nicht schlecht wenn das mit der Lib funzt... Nur kann ich keine UserLibs einbinden wenn ich den Source nicht hab.
Da ich annehme das du den Source für dich behalten willst (oder vielleicht helfen auch ein paar Taler

) würde ich mich auch mit n´paar Tipps oder so zufrieden geben.
Verfasst: 19.10.2004 19:32
von Rings
strgalt hat geschrieben:@Rings
ja, dass währe schon mal nicht schlecht wenn das mit der Lib funzt... Nur kann ich keine UserLibs einbinden wenn ich den Source nicht hab.
Da ich annehme das du den Source für dich behalten willst (oder vielleicht helfen auch ein paar Taler

) würde ich mich auch mit n´paar Tipps oder so zufrieden geben.
hast du denn den Source der PB-Libs ?
Verfasst: 20.10.2004 07:04
von strgalt
@Rings
ne, und drumm schau ich, dass ich möglichst wenig rein nimm, wo ich nichts von hab.
Hab jetzt mal n bissl mit DDE rumgetan.... sollte auch funzen... Aber hätte mir da schon zumindest nen Tipp erwartet
