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

[C#] DllImport Probleem

Pagina: 1
Acties:
  • 689 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hey,

Ik ben ondertussen best bekend met C#. Maar nu voor een schoolproject moet ik een stuk hardware bedienen in mijn programma. Dit is een Analog-to-Digital Converter met een USB aansluiting. Om hier de data van te krijgen in mijn app moet ik een dll van de fabrikant gebruiken.

Maar het probleem is... hij geeft geen error, maar hij doet gewoon niks.

code:
1
2
[DllImport("K8047D.dll")]
public static extern void LEDon();


Dit staat in mijn C# code, en

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
LEDon Turns the Record LED on

LEDon, LEDoff
Syntax
PROCEDURE LEDon;
PROCEDURE LEDoff;
Description
LEDon turns the Record LED on.
LEDoff turns the Record LED off.
Example
BEGIN
LEDon; // Record LED on
END;


staat in de PDF van de fabrikant als documentatie

Het apparaat moet ook geinitialiseerd worden:

code:
1
2
[DllImport("K8047D.dll")]
private static extern void StartDevice();


En als ik dit dan zo aanroep:

code:
1
2
StartDevice();
LEDon();


dan gebeurt er niks...

En ik vraag me nu af, heb ik iets fout gedaan, of ligt het probleem bij de dll?

Verwijderd

Kun je de dll niet toevoegen als referentie aan je Solution (als je Visual Studio gebruikt)?

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Maar het probleem is... hij geeft geen error, maar hij doet gewoon niks.
Probeer eens om bewust een niet-bestaande DLL te importeren, en om een niet-bestaande functie uit de dll aan te roepen. Als je bij elk van deze situaties wel een foutmelding krijgt, kun je ervan uitgaan dat je huidige import-statements in ieder geval wel kloppen en dat de functies uit de DLL ook echt aangeroepen worden.

M.a.w., probeer eens:
code:
1
2
[DllImport("ik_besta_niet.dll")]
public static extern void LEDon();

en
code:
1
2
[DllImport("K8047D.dll")]
public static extern void Bladibla();

en kijk eens of je hier wel foutmeldingen krijgt.

Verwijderd

Topicstarter
Eerst stond mijn K8047D.dll in mijn solution directory, en toen gaf hij een DllNotFoundError, waarna ik die DLL in de system32 folder heb gezet.

En als ik een niet bestaande functie aanroep dan krijg ik een EntryPointNotFoundException...

Dan zal ik denk ik maar even naar de fabrikant gaan mailen, want dan lijken mijn aanroepen gewoon goed...

Bedankt voor de tip

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

gebruik een tool om te zien welke entrypoints de DLL wel heeft... Misschien moet je een bepaalde calling convention gebruiken voor een native DLL :P En in geval van een .NET class library, gebruik de Reflection namespace

-niks-


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Eerst stond mijn K8047D.dll in mijn solution directory, en toen gaf hij een DllNotFoundError, waarna ik die DLL in de system32 folder heb gezet.
Wel in de solution zetten, sowieso. Je wilt niet dat je software in de system32 van de gebruiker gaat rommelen, dat is ERG SLECHT :)

Zet em in de solution, zet de properties op { Build Action = None; Copy to Output Directory = Copy always }. Dan wordt ie 'naast' je executable gezet, en kun je gewoon de DllImport gebruiken waar je mee begon ;)

Maar over je probleem. Hoe weet je zeker dat de functies die je in die DLL aanroept, dat die ook doen wat je van ze verwacht? Misschien ligt het wel aan de code in de DLL.
Misschien moet je een bepaalde calling convention gebruiken voor een native DLL
Calling convention is alleen van toepassing als er parameters aan een functie worden meegegeven. Het is de volgorde van doorgeven en de verantwoordelijkheid van vrijgeven van parameters, iirc. Ook returnt deze functie niks, dus je kan iig niks fout doen wat betreft native datatypes versus managed datatypes.

[ Voor 23% gewijzigd door _Thanatos_ op 11-11-2007 19:51 ]

日本!🎌

Pagina: 1