Domino 9 und frühere Versionen > ND8: Entwicklung
LS/C-API 32/64bit: für $FILE-Item SeqNr, DupID, Object-ID auslesen
thkn777:
Hallo zusammen,
ich will mich für ein ziemlich verrücktes Problem auf Fehlersuche begeben. Dazu benötige ich Informationen über $FILE Items, an die ich mit klassischem Lotus Script (LS) nicht herankomme. Zumindest glaube ich, daß ich da nicht herankomme.
Szenario:
- Lotus Domino Server R8.53 32 und 64bit (jeweils auf Windows Server 32 bzw. 64 bit)
- zyklischer Serveragent
- der Agent prüft in der entsprechenden DB alle Dokumente, die Attachments enthalten
- je Dokument und $FILE Item werden Informationen in eine Protokoll-Datei geschrieben
Was ich schon habe:
- den LS-Agenten an sich
- Ermittlung der Object ID (in Ytria ScanEZ auch als RRV (ID) bezeichnet)
- funktioniert unter 32 Bit
Mein Problem:
- ich bin kein C-API Profi, ein Kollege hat sich vor einiger Zeit mal was "zusammengeborgt" nach diversen Recherchen im Internet, ich hab's nur angepaßt auf meine Zwecke
- Agent läuft nicht unter 64 Bit, bei Ausführung gibt's einen Servercrash
- das macht in meinen Augen auch Sinn, einige Hauptfunktionen benutzen "KERNEL32"
- diese "Bastellösung" möchte ich nicht auf die Menschheit loslassen
Mein Ziel:
- Agent soll stabil unter 32 und 64 bit laufen (64 bit sogar wichtiger als 32 bit)
- ich brauche im LS Funktionen wie "getObjectID(NotesItemName)", "getSequenceNumber" etc. mit Rückgabewert String
- perfekt wäre natürlich eine fertige ScriptLibrary
- ich bau' mir - entsprechende für einen C-API Laien verständliche Beispiele vorausgesetzt - auch gern selbst was zusammen
Ich habe bisher nichts für mich verwertbares im Netz gefunden, nicht hier im Forum, nicht in den notes.net Foren (ja - ich weiß, die heißen jetzt anders...), Frau Google zuckt auch mit den Schultern.
Meine Fragen:
- hat sich jemand von Euch mit diesem Thema schonmal beschäftigt?
- gerade auch unter dem Aspekt 64bit? Am besten suche ich EINEN Ansatz, der auf 32- und 64bit Systemen gleichermaßen funktioniert ODER zwei Verfahren und eine Möglichkeit für mich, auf 32/64 Bit zu prüfen.
- gibt es eine "Abkürzung" für mich (und wenn ja, wie sieht sie aus) oder muß ich in den sauren Apfel beißen, 1000+ Seiten Buch lesen, Testserver aufsetzen, 100+ mal crashen und nebenher 3 Wochen das Tagesgeschäft liegenlassen?
@Tode
Ja, es geht um das $)(/O)%%&/!!!! Problem, das ich auf der Nachlese in München erwähnt habe. Ich rede mittlerweile direkt mit IBM Entwicklern in New York. Keine Aussicht auf Lösung. Frustrierend. :-[
eknori (retired):
Was hast du denn an Code?. In der Regel sind es unter 64Bit die Pointer, die da Probleme machen.
thkn777:
So sieht meine zusammengeborgte Mini-ScriptLib aus:
--- Code: ---Option Public
Type API_TIMEDATE
Innards(1) As Long
End Type
Type API_ORIGINATORID
File As Double
Note As Double
Sequence As Long
SequenceTime As API_TIMEDATE
End Type
Type API_TIME
Year As Long
Month As Long
Day As Long
Weekday As Long
Hour As Long
Minute As Long
Second As Long
hundredth As Long
dst As Long
zone As Long
GM As API_TIMEDATE
End Type
Declare Sub NSFNoteGetInfo Lib "nnotes" Alias "NSFNoteGetInfo" ( _
ByVal note_handle As Long, ByVal note_member As Long, value_ptr As Any)
Declare Function TimeGMToLocal Lib "nnotes" Alias "TimeGMToLocal" ( _
dtTime As API_TIME ) As Long
Const NOTE_OID = 2
Type BlockID
hPool As Long
Block As Integer
End Type
Const wAPIModule = "NNOTES" ' Windows/32
Declare Function OSPathNetConstruct Lib wAPIModule Alias "OSPathNetConstruct" _
( ByVal zP As Long, ByVal S As String, ByVal F As String, ByVal P As String) As Integer
Declare Function NSFDbOpen Lib wAPIModule Alias "NSFDbOpen" _
( ByVal P As String, hDB As Long) As Integer
Declare Function NSFDbClose Lib wAPIModule Alias "NSFDbClose" _
( ByVal hDB As Long) As Integer
Declare Function NSFNoteOpen Lib wAPIModule Alias "NSFNoteOpen" _
( ByVal hDB As Long, ByVal N As Long, ByVal F As Integer, hNT As Long) As Integer
Declare Function NSFNoteClose Lib wAPIModule Alias "NSFNoteClose" _
( ByVal hNT As Long) As Integer
Declare Function OSMemFree Lib wAPIModule Alias "OSMemFree" _
( ByVal hM As Long) As Integer
Declare Function OSLoadString Lib wAPIModule Alias "OSLoadString" _
( ByVal hM As Long, ByVal S As Integer, ByVal B As String, ByVal nB As Integer) As Integer
Declare Function OSLockObject Lib wAPIModule Alias "OSLockObject" _
( ByVal hM As Long) As Long
Declare Sub OSUnlockObject Lib wAPIModule Alias "OSUnlockObject" _
( ByVal hM As Long)
Declare Function NSFItemInfo Lib wAPIModule Alias "NSFItemInfo" _
( ByVal hNT As Long, ByVal N As String, ByVal nN As Integer, iB As BlockID _
, D As Integer, vB As BlockID, nV As Long) As Integer
Declare Function NSFItemInfoNext Lib wAPIModule Alias "NSFItemInfoNext" _
( ByVal hNT As Long, ByVal hP As Long, ByVal B As Integer, ByVal N As String, ByVal nN As Integer, iB As BlockID _
, D As Integer, vB As BlockID, nV As Long) As Integer
Declare Sub NSFItemQuery Lib wAPIModule Alias "NSFItemQuery" _
( ByVal hNT As Long, ByVal hP As Long, ByVal B As Integer _
, ByVal zN As Long, ByVal mN As Integer, nN As Integer _
, F As Integer, T As Integer, vB As BlockID, nV As Long)
Declare Function ConvertTIMEDATEToText Lib wAPIModule Alias "ConvertTIMEDATEToText" _
( ByVal F As Long, ByVal T As Long, ByVal P As Long, ByVal S As String _
, ByVal nS As Integer, rS As Integer) As Integer
Declare Function NSFDbGetObjectSize Lib wAPIModule Alias "NSFDbGetObjectSize" _
( ByVal hDB As Long, ByVal oID As Long, ByVal T As Integer, S As Long _
, C As Integer, P As Integer) As Integer
Declare Sub Peek Lib "KERNEL32" Alias "RtlMoveMemory" _
( D As Any, ByVal P As Long, ByVal N As Long)
Declare Sub PeekString Lib "KERNEL32" Alias "RtlMoveMemory" _
( ByVal D As String, ByVal P As Long, ByVal N As Long)
Declare Sub CopyLS Lib "KERNEL32" Alias "RtlMoveMemory" _
( D As Any, P As Any, ByVal N As Long)
Sub Initialize
End Sub
Function getObjectId(doc As NotesDocument) As String
getobjectId = ""
Const tz = "~~"
Dim s As String
Dim i As Long
s = ""
i = 0
Dim db As NotesDatabase
Set db = doc.ParentDatabase
dp$ = String(1024, " ")
OSPathNetConstruct 0, db.Server, db.FilePath, dp$
Dim hDB As Long
NSFDbOpen dp$, hDB
If hDB = 0 Then Exit function
Dim hNT As Long
NSFNoteOpen hDB, CLng("&H" & doc.NoteID), 0, hNT
If Not hNT = 0 Then
Dim iB As BlockID, vB As BlockID
NSFItemInfo hNT, "$FILE", 5, iB, dt%, vB, nV&
While Not nV& = 0
i = i + 1
NSFItemQuery hNT, iB.hPool, iB.Block, 0, 0, 0, f%, dt%, vB, nV&
If s > "" Then
s = s & tz
End If
s = s & "[$FILE Item=" & CStr(i) & "|" & PeekObjectId(f%, vB, hDB) & "]"
NSFItemInfoNext hNT, iB.hPool, ib.Block, "$File", 5, iB, dt%, vB, nV&
Wend
End If
getObjectId = s
NSFNoteClose hNT
NSFDbClose hDB
End Function
Function PeekObjectId(f%, vB As BlockID, hDB As Long) As String
Const itemflags = "SIGN SEAL SUMMARY &H08 &H10 READWRITERS NAMES " _
& "&H80 PLACEHOLDER PROTECTED READERS &H0800 UNCHANGED"
PeekObjectId = ""
If vB.hPool = 0 Then Exit function
p& = OSLockObject(vB.hPool) + vB.Block
' $FILE Attachment name --> fname$
Peek nF&, p& + 8, 2
fname$ = String$(nF&, " ")
PeekString fname$, p& + 38, nF&
' Object-ID
Peek oID&, p& + 4, 4
OSUnlockObject vB.hPool
PeekObjectId = "filename=" & fname$ & "|Object-ID=" & Right$("00000000" & Hex$(oID&),8)
End Function
--- Ende Code ---
In meinem Agenten (den ich momentan nur vom Client ausführe), kann ich dann einfach mit
--- Code: ---getObjectId(doc)
--- Ende Code ---
die Object-ID's von allen $FILE-Items eines Notesdokumentes auslesen. Die Formatierung des Rückgabewertes paßt sich dem anderen Log-Drumherum an, also bitte nicht wundern.
thkn777:
Update:
- PMR immer noch offen
- ich lasse auf einem Client Agenten laufen, die DB's auf verschiedenen Servern auf die Object-ID prüfen
In dem Zusammenhang eine Frage:
Kennt jemand genauere Zusammenhänge zum Aufbau der Object-ID's? (oder auch RRV genannt) Bei uns kommen zwei Typen vor - sehr niedrige Werte (z.B. 0000012E) und sehr hohe Werte (z.B. 00069772).
Ich wüßte gern, wie dort die Zusammenhänge sind. IBM hat gesagt, es gibt keine... ich glaube da nicht so recht dran.
Pfefferminz-T:
Wenn es irgendwo Doku zu OID etc. gibt, dann in der C-API Hilfe...
Gruss,
Thorsten
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln