Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[c++/c#] dll + wince + C# structs gaat fout

Pagina: 1
Acties:

  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
Ik ben bezig om een programmaatje te schrijven op een pocket pc met wince 5.0 / 2003
Nu loop ik al de hele tijd tegen lastige dingen zoals datatypes die niet onder ce beschikbaar zijn, en functies etc. Veel prog ik eerst op mn laptop (XP) en test het dan over de com poort heen, en als dit werkt (proof of concept) port ik het naar de PDA.
Setup:
Laptop - usb->com1 -> blackbox
Pda -> cradle>com1 -> blackbox

Om de blackbox aan te spreken heb ik een .dll uit de SDK, en een eigen gemaakt DLL'etje om de compoort te benaderen. beide dll's zijn in c++ en ik gebruik voor mijn app C#.
Dit werkt op de laptop:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace WinAppStructTest
{
    public partial class Form1 : Form
    {
        IntPtr pHandle;
        public FM_COMMS_GeneralInfo carinfo;

        public Form1()
        {
            carinfo = new FM_COMMS_GeneralInfo();
        }
        [knip]
        FM_Comms.FM_Comms_GetGeneralInfo(ref carinfo);
         toolStripStatusLabel1.Text = carinfo.dwDriverID.ToString();
}}


en dit gebruik ik als import, en daaronder de struct:
C#:
1
2
3
4
5
6
7
8
9
10
11
[DllImport("FM_Comms.dll")]
public static extern bool FM_Comms_GetGeneralInfo(ref FM_COMMS_GeneralInfo carInfo);

struct:

[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
    public struct FM_COMMS_GeneralInfo
    {
        public UInt32 dwVehicleID;
        [en nog een boel dezelfde type vars]
    }


dit is orgineel c++
C++:
1
2
3
4
5
typedef struct
{
  DWORD dwVehicleID;  
  [en nog meer dezelfde vars]
} tFM_COMMS_GeneralInfo;


Het stomme is dat mijn CE versie nauwelijk verschilt, maar als ik dan data in de struct wil zetten, krijg ik een "Native exception has occured in fm300.exe"
Details:
Exception Code 0xc000005
Exception address 0x01505890
Writing 0x00000000

Gaat CE weer anders om met structs? of het doorgeven van de data in de DLL? zou wellicht de CE versie van de .dll van de SDK corrupt zijn ?

Een andere soortgelijke functie accepteerd zijn struct wel maar krijgt de data er niet in. De Uint32's worden gewoon max gevuld, maar crashed niet.
Een 3e functie geeft weer dezelfde error.

[ Voor 4% gewijzigd door VO-Zephyr op 28-02-2008 11:30 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
doe eens op beide systemen een sizeof( jouwstruct ). Als deze niet hetzelfde is heb je een verschil in groottes van datatypen of alignment oid.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
Ik kan geen sizeof() doen, ik krijg:
Error 1 'WinAppStructTest.Form1.carinfo' is a 'field' but is used like a 'type'

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:35
Ik weet niet hoe dat voor .NET werkt, maar voor C/C++ applicaties integreert Visual Studio heel netjes met de native debugger in Windows CE (en zelfs de device simulator). Kun je het programma eens starten in de debugger en uitzoeken waar 'ie precies crasht, en waarom? Zo in het blinde weg debuggen is nogal lastig en naar mijn idee ook niet nodig.

Trouwens, je hebt je DLL toch wel apart gecompileerd voor Windows CE neem ik aan? Je kunt natuurlijk niet dezelfde DLL onder native Windows XP (i386 architectuur) en ook onder Windows CE (ARMv4 architectuur) gebruiken.

[ Voor 25% gewijzigd door Soultaker op 28-02-2008 15:43 ]


  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
Soultaker schreef op donderdag 28 februari 2008 @ 15:41:
Ik weet niet hoe dat voor .NET werkt, maar voor C/C++ applicaties integreert Visual Studio heel netjes met de native debugger in Windows CE (en zelfs de device simulator). Kun je het programma eens starten in de debugger en uitzoeken waar 'ie precies crasht, en waarom? Zo in het blinde weg debuggen is nogal lastig en naar mijn idee ook niet nodig.

Trouwens, je hebt je DLL toch wel apart gecompileerd voor Windows CE neem ik aan? Je kunt natuurlijk niet dezelfde DLL onder native Windows XP (i386 architectuur) en ook onder Windows CE (ARMv4 architectuur) gebruiken.
Ik heb idd de dll voor winCE gepakt. De emulator werkt deels, het lukt niet om via de emulator mijn compoort op de laptop aan te spreken.
Ik kan wel rechtstreeks deployen op de pda vanuit mn IDE en dan kan ik met F10/F11 door de code heenlopen. Op het moment dat hij aankomt bij de FM_Comms_GetGeneralInfo() geeft hij de error op de pda die ik boven gegeven heb, de IDE geeft geen fout terug

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
VO-Zephyr schreef op donderdag 28 februari 2008 @ 14:36:
Ik kan geen sizeof() doen, ik krijg:
Error 1 'WinAppStructTest.Form1.carinfo' is a 'field' but is used like a 'type'
Natuurlijk kan dat wel, je het alleen zo doen dat de compiler ook snapt wat je wilt.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
farlane schreef op donderdag 28 februari 2008 @ 15:57:
[...]


Natuurlijk kan dat wel, je het alleen zo doen dat de compiler ook snapt wat je wilt.
Okee het is nu wel gelukt:
Pda:
C#:
1
2
int pnt = Marshal.SizeOf(carinfo);
statusBar1.Text = pnt.ToString();

Geeft 72 terug

Laptop:
C#:
1
2
int pnt = Marshal.SizeOf(carinfo);
toolStripStatusLabel1.Text = pnt.ToString();

Geeft ook 72 terug, gelukkig(?)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Jah gelukkig :)

Kun je een assert oid doen die controleert of je ref niet per ongeluk toch 0 is?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
Afbeeldingslocatie: http://img179.imageshack.us/img179/6896/bluhxt1.jpg
Lijkt me gewoon "0", en niet eens "null". Ik maak hem aan met =new.
Als ik daarna 1 keer op F10 druk dan komt bij bij de functie die in de dll staat, en dan geeft hij de error die in de beginpost staat.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Tja, als de velden in die struct allemaal primitives zijn, gaat er toch iets fout bij de aanroep naar de functie, of in de dll functie zelf.

Heb je de mogelijkheid om de dll zelf te debuggen op je target systeem? Anders zou je daar een breakpoint moeten zetten en controleren waar het fout gaat.

Btw, het kan makkelijk zijn dat de fout er ook op je development systeem er al in zit maar zich niet openbaart.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:35
Moet die assertion niet óf falen (carinfo is niet gelijk aan null) óf een null-pointer exception raisen? Als carinfo null is, kun je er immers geen Equals op aanroepen, lijkt me?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Soultaker schreef op donderdag 28 februari 2008 @ 18:05:
Moet die assertion niet óf falen (carinfo is niet gelijk aan null) óf een null-pointer exception raisen? Als carinfo null is, kun je er immers geen Equals op aanroepen, lijkt me?
Nu je het zegt inderdaad. :) Iig is het object wel goed hier, de fout ligt verder weg in de call stack.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
Ik heb een vergissing gemaakt in de begin post, het is een pda met pocket pc 2003 en dat is wince 4.0 ;) En heb nu een device liggen met wince 5.0 maar die pakt die hele dll niet.

  • VO-Zephyr
  • Registratie: Mei 2001
  • Laatst online: 28-03-2024
Ik heb ondertussen maar een service request ingediend bij het bedrijf dat de sdk levert, wellicht dat het 'gewoon' daar in zit. Maar elk idee is welkom ;)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:35
Ik heb helaas geen concrete ideeën. Ik denk sowieso dat je dit soort dingen het beste zelf kunt debuggen (het is heel erg lastig om op afstand een goed idee te krijgen van wat er mis gaat).

Laat vooral weten als je er nog achter komt wat het nu was, dat is altijd leuk om te lezen. ;)
Pagina: 1