Deutsch
Forum

Ole Strings

 

Normann
Strübli
Hallo,

habe die Ehre die Erste Frage hier stellen zu dürfen

Ich arbeite im Augenblick dem Datenbank-System Cheetah
[...]  und das ganze
funzt auch fantastisch. Die Dll unterstützt den Funktionsaufruf mittels
OLE Strings aber auch mit Standard null-terminierten Strings.
So weit so gut...

Nun möchte ich die Memofelder nutzen um dort binäre Daten (Bilder)
zu speichern. Da in der entsprechenden Funktion keine Bereichsvariable
sondern nur der String übergeben wird ist die maximale länge ja auf
32767 Zeichen begrenzt - das langt aber nicht hin

Wenn ich das richtig verstanden habe sind OLE-Strings grob gesagt
dynamische Strings die keine definierte Länge haben und jedes beliebige
Zeichen enthalten können (verbessert mich bitte) und nicht von
Profan unterstützt werden. -also Pech gehabt...

Eigentlich habe ich mir die Frage damit ja schon selbst beantwortet,
oder ich habe da was übersehen???

Leider ist die Datenbank keine Freeware , aber Vielleicht
hat ja jmd. Interesse die ganzen Funktionen für Profan
umzusetzen - habe schon eine Include geschrieben die den Umgang
vereinfacht.

Jetzt mag sich einer Fragen Warum ich die Dll überhaupt benutzte:

1. Sehr klein, stand alone
2. Sehr schnell
3. Umfangreiche Suchfunktionen
4. Will mich nicht mit SQL beschäftigen

hier nochmal kurz die Spezifikationen:

Max number of records: 2,147,483,647
Max number of fields: 1000
Max character field size: 256
Max numeric field size: 20
Max memo size: Limited by disk space
Max record size: 4000 bytes

Indexes
Max open indexes per database: 100
Max fields for compound indexes: 6
Total allowable open indexes: 1000
Queries

Max number of conditions: 50
Max sort expressions: 6
Multiuser

Max number of concurrent users: 255

Gruß
Normann Strübli
 
16.05.2004  
 




Frank
Abbing
Hi,

[quote:a2dedb3643]Nun möchte ich die Memofelder nutzen um dort binäre Daten (Bilder)
zu speichern. Da in der entsprechenden Funktion keine Bereichsvariable
sondern nur der String übergeben wird ist die maximale länge ja auf
32767 Zeichen begrenzt - das langt aber nicht hin

Wenn ich das richtig verstanden habe sind OLE-Strings grob gesagt
dynamische Strings die keine definierte Länge haben und jedes beliebige
Zeichen enthalten können (verbessert mich bitte) und nicht von
Profan unterstützt werden. -also Pech gehabt...
[/quote:a2dedb3643]
Das klingt doch alles nach Bereichen. Wieso kannst du dort keine Bereichsvariable übergeben ? Sollte doch immer funktionieren...
 
17.05.2004  
 




Normann
Strübli
Hallo,

irgendwie klappt das alles nicht so wie ich mir das denke
Daher hab ich mal einen neuen kurzen (echt nicht lang ) Quellcode geschrieben und meine Include und Headerdatei gezippt drangehängt.
Die Hilfedatei von Cheetah ist ebenso dabei wie Beispiele unter Power
und VisualBasic.

Sind leider knapp über 300kB geworden :|
Die Registrierung hab ich natürlich entfernt daher kann es möglich
sein das beim Aufruf der Fehler #99999 Auftritt
(weil testversion abgelaufen). Vielleicht braucht man die DLL ja auch
nicht und sieht gleich wo ich da groben Mist gebaut habe.

Wie gesagt habe anscheinend Probleme das ganze für Xprofan
umzusetzen - naja die einfachen Sachen gehen ja...

Gruß
Normann
 
17.05.2004  
 



Hmmm, ist schwer da durchzusehen, oder gar das Ganze durchzusehen. Vielleicht will die DLL nicht die Bereichsvariable, sondern nur die Adresse der Bereichsvariable, also statt bereich# einfach addr(bereich#).

Vielleicht hilfts Dir ja.

, iF
 
21.05.2004  
 




Frank
Abbing
Hi,

wenn du den Bereich dimensioniert, addiere mal 4 dazu und lösche den Bereich mit CLEAR, bevor du ihn benutzt.
Wahrscheinlich fehlt die Null am Ende, wenn du den Bereich als String in einer API nutzt.
 
22.05.2004  
 




Normann
Strübli
Seufz :|

danke, aber hat beides leider nicht geholfen. Als letzten Anlauf hab ich nochmal die Stellen der Doku rausgesucht die, so glaub ich von interesse sind.
Weiter unten dann der Quellcode für Visual-Basic, wie man Daten in Memofelder schreibt.

Sieht doch so verdammt einfach aus, wieso krieg ich das nicht hin?

Ok, das erste was wohl anders sein wird ist die Geschichte mit den Strings.

Hier ein kleiner Ausschnitt aus der Hilfe:

[quote:a91e835882]
Cheetah can be interfaced with various different programming langauages. By default, Cheetah supports the Visual Basic and PowerBasic, however other programming languages can be interfaced with relative ease.

The key to interfacing to the Cheetah DLL is to understand how strings are handled by your particular programming language. In general, there are two different types of strings that most languages support: OLE Strings, and Nul Terminated Strings. Some languages support both types while others only support one or the other.

OLE Strings (or BSTR strings) are generally used in programminbg languages that allow for dynamic strings. An example is Visual Basic and PowerBasic.

Nul Terminated Strings, or ASCIIZ strings, are a pre-declared array of characters with a terminating nul (CHR$(0)) character at the end of the string. The programming language uses this nul character to mark the end of the string.

In order to support both types of strings, Cheetah has implemented each function in two forms. The regular version of the function supports OLE Strings while the second version supports Nul Terminated Strings. The functions that support Null Terminated Strings have a trailing _Z appended to their names. For example, the following is the two forms of the xdbCreate function.

OLE Version: Call xdbCreate(DBFname)NUL Version: Call xdbCreate_Z(DBFname)
Basically, if your programming language only supports Null Terminated Strings then you should always use the _Z version of the Cheetah functions.

[/quote:a91e835882]
Ok, Profan unterstützt nur Null-Terminierte Strings das sollte das ganze aber nicht viel komplizierter machen.
Verwende ich halt die Funktion xdbAssignField_Z statt xdbAssignField um ein Feld zu beschreiben. Bei dem folgenden Beispiel in VB wird ja aber ein String übergeben? oder doch nicht?

Da bin ich wieder beim Thema OLE-Strings

Andererseits wenn ich folgendes in Profan probiere klappt es:
KompilierenMarkierenSeparieren
...
Declare a$,b$
a$ = "PICTURE"   Das Memofeld heißt so
b$ = "bla bla bla..."
xdbAssignField_Z(maindb&,addr(a$),0,addr(b$))
...

in diesem Fall steht in der Memo-Datei tatsächlich irgendwo bla bla bla
Wenn ich aber mittels b$ = @String$(Pdata#, 0)
(in Pdata# ist die JPG-Datei eingelesen) versuche die Binären
Daten der Datei ins Memofeld zu schreiben klappt es wieder nicht

Die Bildatei ist 35240 Bytes groß womit ich wohl auch das Problem habe, das die Länge der Profan-Strings nicht ausreicht...

Am besten jmd kennt sich mit VB aus und kann mir sagen wie folgender
Quellcode für Profan umzusetzten ist
KompilierenMarkierenSeparieren
Add a picture to the memo file depending on which record number
is currently being used.

Select Case x&

    Case 1
    f& = FreeFile
    Open "binoc.ico" For Binary As #f&
    PictureSt$ = Space$(LOF(f&))
    Get #f&, , PictureSt$
    Close #f&
    Case 2
    f& = FreeFile
    Open "rabbit.wmf" For Binary As #f&
    PictureSt$ = Space$(LOF(f&))
    Get #f&, , PictureSt$
    Close #f&
    also store an AVI clip in the memo file
    f& = FreeFile
    Open "FileCopy.avi" For Binary As #f&
    AVIst$ = Space$(LOF(f&))
    Get #f&, , AVIst$
    Close #f&
    Case 3
    f& = FreeFile
    Open "tennis.wmf" For Binary As #f&
    PictureSt$ = Space$(LOF(f&))
    Get #f&, , PictureSt$
    Close #f&
    End Select

    If PictureSt$ > "" Then

        Call xdbAssignField(cust.dbHandle, "", PictureField&, PictureSt$)
        PictureSt$ = ""
        End If

        If AVIst$ > "" Then

            Call xdbAssignField(cust.dbHandle, "", AVIField&, AVIst$)
            AVIst$ = ""
            End If
 
22.05.2004  
 




Normann
Strübli
So da bin ich wieder bei meinem alten und neuen Problem,

ich weiß jetzt wo der Fehler liegt! -das ist gut
leider hab ich jetzt ein neues Problem! das ist schlecht!

will mich mal kurzfassen:

Die Funktion der Dll ich aufrufen möchte erwartet als letzten Parameter
die Adresse des Strings! der die Daten enthält.
Damit gilt (was ich befürchtet habe) das die Daten nicht beliebig lang sein
dürfen (max 32767 Zeichen) und nicht beliebige Zeichen enthalten können.

Aus der Profan Hilfe:

[quote:3ebb2e12fb]
(ACHTUNG: Strings, die ein Nullbyte enthalten, werden bei Übergabe an DLLs und API nur bis zu diesem übergeben. Das gilt auch für über die API realisierte Funktionen wie GETTEXT$ oder SETTEXT. Für DELPHIaner: Es handelt sich bei den Profan-Strings um die Ansi-Strings von Delphi.)
[/quote:3ebb2e12fb]
Toll, gaaanz toll!
wie soll ich also die binären daten einer z.B. jpg-Datei an die Dll übermitteln wenn bereits nach dem Header der Datei ein Nullbyte folgt???

Als kleines Beispiel nochmal:

Der Aufruf:
KompilierenMarkierenSeparieren
xdbAssignField_Z(dbHandle&,0,PictureField&,addr(Daten$))

mit Textdateien und so klappts ja ganz toll, nützt mir aber nix!

Kennt jemand eine Zauber-API die ich nicht kenne und mir weiterhilft? Assembler? (kenn ich mich *noch* nicht gut mit aus -Frank)
Hab mich daran schon so festgebissen das ich nix anderes mehr geschafft habe
 
06.07.2004  
 




Michael
Wodrich

KompilierenMarkierenSeparieren
xdbAssignField_Z(dbHandle&,0,PictureField&,addr(Daten$))

Dieses xdbAssignField_Z nutzt, wie das Z schon andeutet, nullterminierte Strings. Gibt es da denn keine Funktion, wo man die Adresse des Datenbereiches und dessen Länge angeben muß?

Dann ließe sich das über eine Bereichsvariable lösen. Die Angabe der Bereichsvariablen in der Funktion liefert die Adresse auf den Bereich. Aber ohne eine expliziete Längenangabe kann die externe Funktion ja garnicht wissen, wo Schluß ist...

Mal sehen, ob ich ein wenig Zeit finde. Dann lese ich mich da mal hindurch...

MfG
Michael Wodrich

Was wird eigentlich alles benötigt, um diesen Affen von Tarzans Gnaden auf dem eigenen Rechner zum Laufen zu bringen?
 
Programmieren, das spannendste Detektivspiel der Welt.
07.07.2004  
 



Nun, du könntest deine Binärdaten auch in eine Hexdatenkette umwandeln, um diese via string zu übergeben.

Der Nachteil ist nur, das die Daten genau doppelt so groß werden.

Bis denne, iF
 
07.07.2004  
 




Normann
Strübli
@Miachael:
[quote:852fb8c5ee]
Dieses xdbAssignField_Z nutzt, wie das Z schon andeutet, nullterminierte Strings. Gibt es da denn keine Funktion, wo man die Adresse des Datenbereiches und dessen Länge angeben muß?
[/quote:852fb8c5ee]
Nein eben nicht! oder ich bin zu blöd.

[quote:852fb8c5ee]
Was wird eigentlich alles benötigt, um diesen Affen von Tarzans Gnaden auf dem eigenen Rechner zum Laufen zu bringen?
[/quote:852fb8c5ee]
Eigentlich brauchst Du dir nur die Demoversion runterladen:
(sind auch nur ca. 230kb)
[...] 
Und ich hab da noch mal die von mir (nicht ganz komplett) umgeschriebene Inlude bzw. Headerdatei angehängt.

Hab ja gehört es soll wieder gaaanz schlechtes Wetter kommen und
da weiß man ja immer nicht so richtig was man machen soll...

Mit anderen Worten: wäre nett wenn Du die Zeit finden würdest.

@IF:

Will aber nicht!

Gruß
Normann
 
07.07.2004  
 




Michael
Wodrich
Tarzan hat seinen Affen nach einem Leoparden (oder Geparden?) benannt?

Nunja:

Außer in der Lobhudelei der DLL wird das Memofeld nirgendwo wirklich mit auch nur einem einzigen Wort oder einem Beispiel gewürdigt.

Deshalb mein Tipp: gehe dort ins Forum und frage mal ganz scheinheilig nach einem funktionsfähigen Beispiel für das Laden eines Bildes in ein Memofeld.

Ich fürchte nämlich, daß man sich die Unterstützung von Memofeldern für eine spätere Version aufgehoben hat.

MfG
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
08.07.2004  
 




Normann
Strübli
Ja, recht hast Du in der Hilfe steht darüber bedenklich wenig.
Aber das mit den Memofeldern funktioniert DEFINITIV!
Sonst hätte ich mich nicht zum Affen gemacht und das Teil gekauft

Auf die Idee mit dem Forum bin ich natürlich auch schon gekommen, hab sogar
ne Mail direkt an den Support geschickt und die verweisen auf
die Beispiele in VB usw.
Im Unterverzeichnis VisualBasicBlobsamplefrmMainForm.frm ist z.B. so
ein Beispiel (da geht das sogar mit mehren Memofeldern pro Datensatz!)

Und ich kann ja auch was in den Memofeldern speichern nur leider halt eben Text.
Thorsten [...]  hat ja auch mal eine Dll gebastelt EasyDB.dll die auch wirklich nicht schlecht ist, nur leider mit mit Bildern in der Größenordnung von 12000 Stück etwas zu langsam.

Also hab ich mein Geld wohl trotzdem leider in den Sand gesetzt, weil
genau das was ich am dringensten benötige mit Xprofan so nicht zu
realisieren scheint. Aber vielleicht kannst Du dir das Beispiel ja noch
mal angucken hast es ja eh mit runtergeladen

Gruß
Normann
 
08.07.2004  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

16.278 Betrachtungen

Unbenanntvor 0 min.
H.Brill21.05.2024
Member 361000511.11.2022
RudiB.26.04.2022
Ingo20.01.2020
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie