Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


mer unmanaged

Postades av 2003-03-05 16:53:57 - Peter Bladh, i forum c# (c-sharp), Tråden har 10 Kommentarer och lästs av 804 personer

Jag jobbar med C# i Compact Framework mot en "vanlig" c++ dll. Vissa av dess funktioner tar struktar. I riktiga .net framework kan man använda sig av MarshalAs, men den finns inte tillgänglig i CF. Hur uppnår man samma sak i CF?
Jag läste i ett annat forum att man då istället kan använda en klass, men då dök nästa problem upp. Man kan inte göra en pekare till en managed type ("Cannot take the address or size of a variable of a managed type"). Hur gör jag min klass unmanaged? Det räcker iallafall inte med att ha med nyckelordet unsafe. I klassen har jag också character arrayer med fast längd. Talar användingen av "new" emot att det skall fungera?

Tack på förhand!
/peterbladh


Svara

Sv: mer unmanaged

Postades av 2003-03-05 21:29:49 - Mattias Sjögren


>Hur uppnår man samma sak i CF?

Beror på från fall till fall. Sök i google arkiven för microsoft.public.dotnet.framework.compactframework så hittar du en del tips. Framför allt

http://groups.google.com/groups?selm=OcNZ3bdvCHA.1132%40TK2MSFTNGP12


>Hur gör jag min klass unmanaged?

Det går inte i C#.


>Talar användingen av "new" emot att det skall fungera?

Förstår inte frågan.


MS


Svara

Sv: mer unmanaged

Postades av 2003-03-06 08:23:03 - Peter Bladh

>>Talar användingen av "new" emot att det skall fungera?

>Förstår inte frågan

Alltså det finns ju value types och reference types. Om man kör new på en char blir det då reference type? Om det blir det så är det ju till nackdel för C-koden som inte vill ha ett objekt.

/peterbladh


Svara

Sv: mer unmanaged

Postades av 2003-03-06 08:27:26 - Roger Alsing

jag använder pekare till structar/klasser och det fungerar fint.
marshallAs använder du när du vill konvertera tex en sträng till något annat , dvs hur bytarna ligger i minnet , om din struct är rätt deklarerad behövs inte detta...


läs om [StructLayout(LayoutKind.Sequential)]
och om kommandot "fixed"







exempel på struct som går att använda med pekare.

<code>
[StructLayout(LayoutKind.Sequential)]
struct _NCCALCSIZE_PARAMS
{
public RECT NewRect;
public RECT OldRect;
public RECT OldClientRect;

public WINDOWPOS lppos;
}
</code>



//Roger


Svara

Sv: mer unmanaged

Postades av 2003-03-06 09:23:32 - Peter Bladh

OK,
men då kommer nästa grej - jag behöver fixed sized arrays i structen (char arr[8] i C). Hur får jag till det?

/peterbladh


Svara

Sv: mer unmanaged

Postades av 2003-03-06 09:33:26 - Roger Alsing

[StructLayout(LayoutKind.Sequential)]
struct MyStruct
{
public byte[] arr;
}


...

MyStruct a=new Mystruct();
a.arr = new byte[8];

anrop(a);

...

[edit]

oke , det är jag som svamlar...
det gick bra att HÄMTA en struct från en pekare...
dock inte att skapa en struct och göra en pekare till den...


men går det inte reklarera parametern som "ref" i anropet?

[/edit]



Svara

Sv: mer unmanaged

Postades av 2003-03-06 10:40:22 - Peter Bladh

Jag får NotSupportedException om jag kör med ref (på den rad funktionen körs). Och med pekare på structen får jag som sagt kompileringsfel; "Cannot take the address or size of a variable of a managed type"

En workaround är ju att göra ett enklare interface i c dllen eller göra en ny som som fungerar som mellanhand. Detta känns dock inte särskilt bra, så ny uppslag mottages gladeligen:)

/peterbladh


Svara

Sv: mer unmanaged

Postades av 2003-03-06 10:41:04 - Mattias Sjögren

>Alltså det finns ju value types och reference types. Om man kör new på en char blir det då reference type?

Nej, typen är vad den är, new påverkar inte det.


MS


Svara

Sv: mer unmanaged

Postades av 2003-03-06 12:28:04 - Roger Alsing

detta fungerar , dock är det ju kraftigt osnyggt...

<code>
//'skapa en buffer för din strukt , måste vara samma storlek som structen i antal bytes
byte[] buffer=new byte [12];

//'få en pekare till första posten i buffern
fixed (byte* buffstart=&buffer[0])
{
//'koppla en mystruct pekare till samma minnes area som buffern
MyStruct* mystruct = (MyStruct*)(void*)buffstart;

//sätt värden på alla params..
mystruct->SomeValue =123;
mystruct->b1 =1;
mystruct->b2 =1;
mystruct->b3 =1;

//'anropa
anrop(mystruct);
}
</code>


och här kommer det fulaste :)

<code>
[StructLayout(LayoutKind.Sequential)]
struct MyStruct
{
public int SomeValue;
//' meningen är att dessa esätter din char/byte []
public byte b1;
public byte b2;
public byte b3;
public byte b4;
public byte b5;
public byte b6;
public byte b7;
public byte b8;
}
</code>




Svara

Sv: mer unmanaged

Postades av 2003-03-06 12:50:41 - Roger Alsing

detta kanske är snyggare

<code>
using System;

namespace ConsoleApplication1
{
class MyStruct
{
public int SomeValue=0;
public long SomeOtherValue=0;
//NOTE: max 8 bytes..
public string MyString="";


public byte[] Marshall()
{
byte[] buffer=new byte[4+8+8];

byte[] bytes=null;

bytes=BitConverter.GetBytes (this.SomeValue);
Array.Copy (bytes,0,buffer,0,bytes.Length);

bytes=BitConverter.GetBytes (this.SomeOtherValue);
Array.Copy (bytes,0,buffer,4,bytes.Length);

if (MyString.Length <8)
{
//forcera till 8 bytes
MyString+=new string (' ',8-MyString.Length);
}
else if (MyString.Length>8)
{
//klipp om den är för lång
MyString=MyString.Substring (0,8);
}

bytes=System.Text.Encoding.ASCII.GetBytes(MyString);
Array.Copy (bytes,0,buffer,4+8,bytes.Length);

return buffer;
}
}


class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
MyStruct ms=new MyStruct ();
ms.MyString ="khdjkhj";
ms.SomeOtherValue =123;
ms.SomeValue =661;
byte[] buffer=ms.Marshall ();
unsafe
{
fixed (byte* b = &buffer[0] )
{
for (int i=0;i<4+8+8;i++)
{
Console.WriteLine (b[i]);
}

//skicka b istället för din struct , eftersom b är en pekare till en
//minnes area som innehåller det du vill att den ska göra
Anrop(b);
}
}
Console.ReadLine ();
}
}
}
</code>




Svara

Sv: mer unmanaged

Postades av 2003-03-06 15:35:49 - Peter Bladh


Men sedär ja. Det funkar ju!

Tack så mycket!!



/peterbladh


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 154
27 952
271 704
660
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies