Avatar billede macromedianoob Nybegynder
14. marts 2005 - 10:31 Der er 6 kommentarer og
1 løsning

Dllimport af dato fra C dll.

Jeg har et problem mht. import af dato og tid fra en dll lavet i C. Datostrukturen i C ser således ud:

struct TMDT    // time and date
{uchar tsc;    //  second (0->59)
uchar tmn;    //  minute (0->59)
uchar thr;    //  hour (0->23)
uchar ddy;    //  day (0->30)
uchar dmn;    //  month (0->11)
uchar dyr;    //  year offset from 2000 (0->99)
};

Jeg har prøvet at hente værdierne ud vha. en DateTime variabel men den går ikke. Jeg har søgt på nettet og er kommet frem til at det muligvis kunne lade sig gøre vha. noget "Marshalling", men da jeg er ny på dllimport-området har jeg ikke helt fundet ud af hvordan det virker endnu. På forhånd tak!
Avatar billede spif2001 Nybegynder
14. marts 2005 - 12:23 #1
Jeg sad engang og fuskede med at loade data fra en binærfil hvori der lå structs ind i objekter, og min fremgangsmåde var som følger:

using System.IO;
using System.Runtime.InteropServices;

private static DateTime LoadDateFromStream(FileStream str)
{
    try
    {
        byte[] byteArr = new byte[str.Length];
        str.Read(byteArr,0,(int)str.Length);
        IntPtr p = Marshal.AllocHGlobal((int)str.Length);
        DateTime dt = new DateTime();

        Marshal.Copy(byteArr,0/*startindex af structen i streamen*/,p,Marshal.SizeOf(dt));
        dt = (DateTime)Marshal.PtrToStructure(p,typeof(DateTime));
        Marshal.FreeHGlobal(p);

        return dt;
    }//try
    catch(Exception e)
    {
        throw e;
    }//catch
}

Det jeg lavede dengang havde ikke noget med DateTime at gøre, og jeg kan ikke teste den ovenstående kode, men det virkede for mine structs.

Ikke den største hjælp :)  - men håber det kan hjælpe på vej...

-spif2001
Avatar billede spif2001 Nybegynder
14. marts 2005 - 12:34 #2
Du skal nok lave en struct magen til C structen i C# som du kan lægge dataene over i, i stedet for det DateTime fusk jeg laver ovenover, og så bagefter sætte et DateTime objekt med værdierne fra structen.

-spif2001
Avatar billede Lasse Novice
14. marts 2005 - 19:33 #3
Dette er ikke testet:

c#
private class TMDT
{
byte tsc;
byte tmn;
byte thr;
byte ddy;
byte dmn;
byte dyr;
}

Lad os antage C kaldet ser saaledes ud:

void GetDate(TMDT* data);

I C# skriver du:

[DllImport("dllfilename.dll")]
void GetDate(TMDT timeClass);

En klasse i C# tilsvarer en pointer i C. Derfor behoever du ingen fanzy tricks udover dette.

Idet du skal bruge det, skriv da:

TMDT timeClass = new TMDT();
GetDate(timeClass);

Hvis du stadig har problemer, saa giv mig functionen du proever at kalde og i hvilken dll den ligger.
Avatar billede macromedianoob Nybegynder
18. marts 2005 - 12:27 #4
Tak for hjælpen
Avatar billede macromedianoob Nybegynder
18. marts 2005 - 12:29 #5
men jeg kan ikke give jer point, jeg tror at I skal svare igen :)
Avatar billede spif2001 Nybegynder
18. marts 2005 - 13:46 #6
Kommer jo an på hvem der skal have pointene ;)
Avatar billede Lasse Novice
18. marts 2005 - 16:49 #7
svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester