C-DLL Aufruf mit Ergebnis in int-Vars [erledigt]

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

C-DLL Aufruf mit Ergebnis in int-Vars [erledigt]

Beitrag von Werner_Bayern »

Was mache ich hier falsch?

Code: Alles auswählen

int XAPIENTRY XDateUnpackA(double value, int* year, int* month, int* day, int* hour, int* min, int* sec, int* msec)
soll mir aus der C-Lib einen Datumswert in die angegebenen Vars schreiben. Der Rückgabewert der Funktion ist 0 für ok, und <> 0 für Fehler.

Das hab ich dann mit der ot4x.lib so umgesetzt:

Code: Alles auswählen

DLL x.dll IMPORT dateUnpack AS int;
   PARAM nWert AS Double,;
   PARAM nYear AS int,;
   PARAM nMonth AS int,;
   PARAM nDay AS int,;
   PARAM nHour AS int,;
   PARAM nMin AS int,;
   PARAM nSec AS int,;
   PARAM nMsec AS int;
SYMBOL XDateUnpackA
Bekomme aber immer den "Interne Datenstrukturen beschädigt" mit folgendem Code:

Code: Alles auswählen

nJahr := nMonat := nTag := nStunde := nMinute := nSekunde := nMilliSekunde := 0
dateUnpack(nTemp, @nJahr, @nMonat, @nTag, @nStunde, @nMinute, @nSekunde, @nMilliSekunde)
nTemp ist korrekt mit einem zuvor aus der Lib ausgelesenen Datumswert belegt, der eine Zahl darstellt und mit obiger Funktion zerlegt werden soll.
Zuletzt geändert von Werner_Bayern am So, 23. Dez 2012 22:18, insgesamt 1-mal geändert.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von brandelh »

Ich würde Pablo fragen, ob die mit int* bezeichneten Variablen richtig umgesetzt sind.
Eventuell muss man dort definieren, dass es Pointer sind und es reicht nicht, es im Parameter zu tun (@).
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:nTemp ist korrekt mit einem zuvor aus der Lib ausgelesenen Datumswert belegt, der eine Zahl darstellt und mit obiger Funktion zerlegt werden soll.
hm ... üblicherweise wird DateTime doch als YYYYMMDDHHMMSS - STRING ausgegeben.
in ot4xb gibt es die Function FileTime() welche diese Structur hat.

Code: Alles auswählen

typedef struct STRUCT tagFILETIME 
{
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} 
FILETIME;
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von Werner_Bayern »

brandelh hat geschrieben:Ich würde Pablo fragen, ob die mit int* bezeichneten Variablen richtig umgesetzt sind.
Eventuell muss man dort definieren, dass es Pointer sind und es reicht nicht, es im Parameter zu tun (@).
Weißt Du, wie das geht, dann teste ich es einfach, ohne da gleich Pablo zu fragen?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von Werner_Bayern »

AUGE_OHR hat geschrieben:in ot4xb gibt es die Function FileTime() welche diese Structur hat.
Nach meinem Verständnis hilft mir hier aber die Struktur nicht, da die Vars einzeln übergeben werden müssen und nicht eine Struktur?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:
AUGE_OHR hat geschrieben:in ot4xb gibt es die Function FileTime() welche diese Structur hat.
Nach meinem Verständnis hilft mir hier aber die Struktur nicht, da die Vars einzeln übergeben werden müssen und nicht eine Struktur?
FileTime() hat eine 64bit Structure wobei low/high jeweils 32bit Werte sind.
es gibt da die Method

Code: Alles auswählen

   METHOD _GetTimeStamp_( cFmtStr )

           Format the timestamp using a cPrinf() like template
           by example ::GetTimeStamp14() is defined as:

       return ::_GetTimeStamp_('%04.4hu%02.2hu%02.2hu%02.2hu%02.2hu%02.2hu')

       parameters are int32 holding: year,month,day,hour,minute,second,milliseconds
vielleicht kannst du das verwenden ?
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von Werner_Bayern »

Servus Jimmy,

ich wüsste nicht, wie ich das hier verwenden soll, sorry, da blicke ich nicht durch. Den Wert, den ich der C-Funktion übergebe, sieht auch völlig anders aus, ist z. B. 41255 und müsste das Datum 12.12.2012 mit irgendeiner Uhrzeit sein.
Es geht hier wohl ums Grundsätzliche, hab noch mehr Funktionen, die ich vermutlich so aufrufen muss und da gehts nicht um Datums-Werte. Ist wohl eher in die Richtung, wie Hubert geschrieben hat?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von AUGE_OHR »

hi,

ich bezog mich mit FileTime() nun speziell auf Datum / Zeit Berechnungen.
der numerische Wert 41255 ist IMHO nur der Pointer "wo" sich die Struktur befindet.

klar kannst du die Structure auch nachbauen

Code: Alles auswählen

cConvertTime:=w2Bin(Year(dDate))+w2Bin(Month(dDate))+w2Bin(0)+w2Bin(Day(dDate))+w2Bin(THours(cTime))+w2Bin(TMins(cTime))+w2Bin(TSecs(cTime))+w2Bin(0)
  IF DllCall("Kernel32.dll",DLL_STDCALL,"SystemTimeToFileTime", cConvertTime, @cFileTime)==0
    RETURN Space(8)
  ENDIF

RETURN cFileTime
aber mit ot4xb muss man es eben nicht weil die ganzen Strukturen schon vorhanden sind.
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von Werner_Bayern »

Servus Jimmy,

danke.

Aber weder mit

Code: Alles auswählen

static function dateUnPack(cConvertTime)
local cFileTime := space(8)

IF DllCall("Kernel32.dll",DLL_STDCALL,"SystemTimeToFileTime", cConvertTime, @cFileTime)==0
    RETURN Space(8)
ENDIF
RETURN cFileTime
noch mit

Code: Alles auswählen

DLL Kernel32.dll IMPORT dateUnPack AS int;
   PARAM nHandle AS HANDLE,;
   PARAM cFileTime AS LPSTR;
SYMBOL SystemTimeToFileTime
funktioniert es, immer wieder "interne Datenstrukturen beschädigt".
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von Werner_Bayern »

AUGE_OHR hat geschrieben:der numerische Wert 41255 ist IMHO nur der Pointer "wo" sich die Struktur befindet
Nein, ziemlich sicher nicht, er muss mit der Funktion aus der C-Lib in ein Datum zerlegt werden.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von brandelh »

Werner_Bayern hat geschrieben:
brandelh hat geschrieben:Ich würde Pablo fragen, ob die mit int* bezeichneten Variablen richtig umgesetzt sind.
Eventuell muss man dort definieren, dass es Pointer sind und es reicht nicht, es im Parameter zu tun (@).
Weißt Du, wie das geht, dann teste ich es einfach, ohne da gleich Pablo zu fragen?
Sorry, ich nutze diese Syntax nicht.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von AUGE_OHR »

hi,

zunächst eine Korrektur : die Funktion von Pablo heisst FileTime64() und hat nichts mit FileTime() aus den XbTools zu tun.

ich "denke" das es zu Problemen führt wenn man Xbase++ / BAP Konstruktionen UND ot4xb verwenden will.
FileTime64() ist ja "die" API Funktion für Date / Time siehe http://msdn.microsoft.com/en-us/library ... 85%29.aspx

das Problem sind die 2 x 32bit DWORD die zusammen das Datum ergeben.

Beispiel : January 1, 1601 (UTC) -> 150183 days, 9 hours, 45 minutes, 3 seconds and 180 thousands, they should be about:

0x779C70C0 (low)
0x01CCFEA2 (high)

wenn du das jetzt "selbst" hin-her rechnen willst ... in ot4xb gibt es die entsprechenden Funktionen

Code: Alles auswählen

XPPRET XPPENTRY wapist_FILETIME64( XppParamList pl ) // <doc!xb!!|CLASS{FileTime}from{gwst}| />
{
   ContainerHandle conco = _conClsObj("FILETIME64");
   if( conco == NULLCONTAINER )
   {
      TXbClass * pc = new TXbClass;
      pc->ClassName("FILETIME64");
      pc->GwstParent();
      pc->EXPORTED();
      pc->GwstReadWrite();
      // ---------------------------
      pc->Member_DWord("dwLowDateTime"); // <doc!xb!!|ivar{FileTime:dwLowDateTime}|short{}| />
      pc->Member_DWord("dwHighDateTime"); // <doc!xb!!|ivar{FileTime:dwHighDateTime}|short{}| />
      // ---------------------------
      pc->GwstSetOffset(0);
      pc->Member_DWord64("qft");
      // ---------------------------
      pc->MethodCB("SetTimeStamp","{|s,c,sh| ft64_SetTs(s,c,@sh),s}");
      pc->MethodCB("_GetTimeStamp_","{|s,f| ft64_GetTs(s,f)}");
      pc->MethodCB("GetTimeStamp","{|s| ft64_GetTs(s)}");
      pc->MethodCB("GetTimeStamp19","{|s| ft64_GetTs(s)}");
      pc->MethodCB("GetTimeStamp14","{|s| ft64_GetTs(s,'%04.4hu%02.2hu%02.2hu%02.2hu%02.2hu%02.2hu')}");
      pc->MethodCB("GetIso8601","{|s| ft64_GetTs(s,'%04.4hu-%02.2hu-%02.2huT%02.2hu:%02.2hu:%02.2hu')}");
      pc->PropertyCB("cTimeStamp","{|s,v| iif(PCount() > 1,ft64_SetTs(s,v),ft64_GetTs(s))}");
      pc->MethodCB("SetDateTime","{|s,d,t| ft64_SetDateTime(s,d,t),s}");
      pc->MethodCB("GetDateTime","{|s,d,t| ft64_GetDateTime(s,@d,@t),s}");
      pc->MethodCB("GetDateTimeSec","{|s,d,t| ft64_GetDateTimeSec(s,@d,@t),s}");
      pc->MethodCB("Now","{|s,lLocal| ft64_Now(s,lLocal),s}");
      pc->MethodCB("NowL","{|s| s:Now(.T.) }");
      pc->MethodCB("ElapMilliSeconds","{|s,t2,lLocal| ft64_ElapMilliSeconds(s,t2,lLocal)}");
      pc->MethodCB("ElapMilliSecondsL()","{|s,v| s:ElapMilliSeconds(v,.T.) }");
      pc->MethodCB("ElapSeconds","{|s,t2,lLocal| ft64_ElapSeconds(s,t2,lLocal)}");
      pc->MethodCB("ElapSecondsL","{|s,v| s:ElapSeconds(v,.T.) }");
      pc->MethodCB("Compare","{|s,t2| ft64_Compare(s,t2)}");
      // ---------------------------
      // ---------------------------
      pc->MethodCB("Day","{|s| Day(s:dDate)}");
      pc->MethodCB("Month","{|s| Month(s:dDate)}");
      pc->MethodCB("Year","{|s| Year(s:dDate)}");
      pc->PropertyCB("dDate","{|s,v| iif(PCount() > 1, s:SetDateTime(v) ,s:GetDateTime(@v)),v}");
      pc->PropertyCB("cTime","{|s,v| iif(PCount() > 1, s:SetDateTime(,v) ,s:GetDateTime(,@v)),v}");
      pc->PropertyCB("nTime","{|s,v| iif(PCount() > 1, s:SetDateTime(,v) ,s:GetDateTimeSec(,@v)),v}");
      // ---------------------------
      pc->MethodCB("AddMilliSeconds","{|s,n| ft64_Add(s,n,1),s}");
      pc->MethodCB("AddSeconds","{|s,n| ft64_Add(s,n,1000),s}");
      pc->MethodCB("AddMinutes","{|s,n| ft64_Add(s,n,60000),s}");
      pc->MethodCB("AddHours","{|s,n| ft64_Add(s,n,3600000),s}");
      pc->MethodCB("AddDays","{|s,n| ft64_Add(s,n,86400000),s}");
      // ---------------------------
      pc->MethodCB("AddMonths","{|s,n| Ft64_Add_M(s,n),s}");
      pc->MethodCB("AddYears","{|s,n| Ft64_Add_Y(s,n),s}");
      // ---------------------------
      pc->PropertyCB("cHexTs","{|s,v| iif(PCount() > 1, s:SetHexTs(v) ,s:GetHexTs())}");
      pc->MethodCB("SetHexTs" , "{|s,v| iif( ValType(v) =='C',PokeStr(s,0,nHex2Qw(v)),),NIL }");
      pc->MethodCB("GetHexTs" , "{|s,v| cQw2Hex( s:qft ) }");
      // ---------------------------
      pc->MethodCB("SetDosDateTime","{|s,v| Ft64_From_DosDateTime(s,v),s}");
      pc->MethodCB("GetDosDateTime","{|s| Ft64_To_DosDateTime(s)}");
      pc->PropertyCB("nDosDateTime","{|s,v| iif(PCount() > 1,Ft64_From_DosDateTime(s,v),Ft64_To_DosDateTime(s))}");
      // ---------------------------
      pc->MethodCB("SetUnixTime","{|s,v| Ft64_From_UnixTime(s,v),s}");
      pc->MethodCB("GetUnixTime","{|s| Ft64_To_UnixTime(s)}");
      pc->PropertyCB("nUnixTime","{|s,v| iif(PCount() > 1,Ft64_From_UnixTime(s,v),Ft64_To_UnixTime(s))}");
      // ---------------------------
      pc->MethodCB("SetExcelTime","{|s,v| Ft64_From_ExcelTime(s,v),s}");
      pc->MethodCB("GetExcelTime","{|s| Ft64_To_ExcelTime(s)}");
      pc->PropertyCB("nExcelTime","{|s,v| iif(PCount() > 1,Ft64_From_ExcelTime(s,v),Ft64_To_ExcelTime(s))}");      
      
      // ---------------------------      
      conco = pc->Create();
      delete pc;
      if( conco == NULLCONTAINER ){_ret(pl); return;}
   }
   _conReturn(pl,conco);
   _conRelease(conco);
}
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von Werner_Bayern »

Servus Jimmy,

danke, dass Du Dir die Arbeit hier machst, aber davon verstehe ich absolut nichts. Der Syntax sagt mir nichts und löst auch nicht mein ursprüngliches Problem:

"Interne Datenstrukturen beschädigt" beim Aufruf der o. zitierten C-Funktion, die mir wohl Werte in die übergebenen Vars schreiben soll.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von AUGE_OHR »

hi,

sorry ich kann es leider nicht besser erklären ... vielleicht solltest du wirklich bei Pablo mal eine Anfrage starten.
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von Werner_Bayern »

Servus Jimmy,

hab ich jetzt gemacht, werde das Ergebnis hier posten.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: C-DLL Aufruf mit Ergebnis in int-Vars

Beitrag von Werner_Bayern »

und hier die Antwort von Pablo, so funktioniert es!
Hi,

int* mean a pointer to 32bit integer ( in C++ the asterisks mean pointer to) so your DLL IMPORT must be

DLL x.dll IMPORT dateUnpack AS int;
PARAM nWert AS Double,;
PARAM nYear AS LPLONG,;
PARAM nMonth AS LPLONG,;
PARAM nDay AS LPLONG,;
PARAM nHour AS LPLONG,;
PARAM nMin AS LPLONG,;
PARAM nSec AS LPLONG,;
PARAM nMsec AS LPLONG;
SYMBOL XDateUnpackA

Regards,
Pablo Botella
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten