Onlangs heb ik een Velleman USB EXPERIMENT INTERFACE BOARD K8055N aangekocht, in elkaar gesoldeerd en getest met de demo software.

Nu zou ik graag dit bord programmeren in Visual C++ (beginner).

Heb de laatste nieuwe K8055D.dll (versie 5) gedownload en in de C:\Windows\SysWOW64\ folder geplaatst (64bit).

Nu moeten er enkele files worden aangemaakt:

Source file (.cpp)
(klein programma dat een digitale uitgang set)


#include <iostream>
#include "K8055D.h"
using namespace std;

int main(){
	OpenDevice(0);
	SetDigitalChannel(5);
	system ("pause");
	CloseDevice();
}

Header File (K8055D.h)
(code gekopieerd uit de handleiding van velleman)


#ifdef __cplusplus
extern "C" {
#endif

#define FUNCTION __declspec(dllimport)

FUNCTION int __stdcall OpenDevice(int CardAddress);
FUNCTION void __stdcall CloseDevice();
FUNCTION int __stdcall ReadAnalogChannel(int Channel);
FUNCTION void __stdcall ReadAllAnalog(int *Data1, int *Data2);
FUNCTION void __stdcall OutputAnalogChannel(int Channel, int Data);
FUNCTION void __stdcall OutputAllAnalog(int Data1, int Data2);
FUNCTION void __stdcall ClearAnalogChannel(int Channel);
FUNCTION void __stdcall ClearAllAnalog();
FUNCTION void __stdcall SetAnalogChannel(int Channel);
FUNCTION void __stdcall SetAllAnalog();
FUNCTION void __stdcall WriteAllDigital(int Data);
FUNCTION void __stdcall ClearDigitalChannel(int Channel);
FUNCTION void __stdcall ClearAllDigital();
FUNCTION void __stdcall SetDigitalChannel(int Channel);
FUNCTION void __stdcall SetAllDigital();
FUNCTION bool __stdcall ReadDigitalChannel(int Channel);
FUNCTION int __stdcall ReadAllDigital();
FUNCTION int __stdcall ReadCounter(int CounterNr);
FUNCTION void __stdcall ResetCounter(int CounterNr);
FUNCTION void __stdcall SetCounterDebounceTime(int CounterNr, int DebounceTime); 
FUNCTION int __stdcall Version();
FUNCTION int __stdcall SearchDevices();
FUNCTION int __stdcall SetCurrentDevice(int CardAddress);

#ifdef __cplusplus
}
#endif

het uitvoeren in het programma MS Visual C++ 2010 Express krijg ik de volgende fouten:


1>------ Build started: Project: Test K8055, Configuration: Debug Win32 ------
1>  Main.cpp
1>Main.obj : error LNK2019: unresolved external symbol __imp__CloseDevice@0 referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol __imp__SetDigitalChannel@4 referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol __imp__OpenDevice@4 referenced in function _main
1>D:\documenten\projecten\K8055N\Visual C++ Projects\Test K8055\Debug\Test K8055.exe : fatal error LNK1120: 3 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Nu heb ik te weinig ervaring met C++ om te begrijpen wat nu juist het probleem is, kan iemand mij hierbij helpen aub?

Via google ben ik de volgende link al tegen gekomen: http://forum.velleman.eu/viewtopic.php?f=3&t=2008
Uit de informatie op die website versta ik, dat ik een .lib file moet aanmaken die er voor zorgt dat er een verwijzing wordt gemaakt van men header file naar men .dll file..?

heb dit ook even opgezocht en heb een manier gevonden om van men .dll file een .lib te maken, op deze website: http://adrianhenke.wordpress.com/2008/12/05/create-lib-file-from-dll/
mijn .def file komt er dan zo uit te zien:


EXPORTS
ClearAllAnalog
ClearAllDigital
ClearAnalogChannel
ClearDigitalChannel
CloseDevice
Connected
OpenDevice
OutputAllAnalog
OutputAnalogChannel
ReadAll
ReadAllAnalog
ReadAllDigital
ReadAnalogChannel
ReadBackAnalogOut
ReadBackDigitalOut
ReadCounter
Readcounter16
ReadDigitalChannel
ResetCounter
SearchDevices
SetAllAnalog
SetAllDigital
SetAnalogChannel
SetCounterDebounceTime
SetCurrentDevice
SetDigitalChannel
SetPWM
Version
WriteAllDigital

Als ik deze .def file wil omvormen naar een .lib file met de volgende instructie in de opdracht prompt van visual studio:


lib /def:C:\mypath\mylib.def /OUT:C:\mypath\mylib.lib

Lukt dit niet... er komt geen .lib bestand te staan in de map.

Eigenlijk vindt ik dit allemaal een omslachtige weg en vraag ik mij af of dit niet eenvoudiger kan?

Hopelijk kan één van jullie mij helpen.
Alvast bedankt!

Kenny

Heb zelf nog wat verder gezocht en misschien heb ik het antwoord gevonden in de handleiding van de K8055.dll file:

In de handleiding staat dat er geprogrammeerd kan worden in MS Visual C++. Als opmerking staat er "Microsoft Visual Studio users please note: The K8055D.DLL is a standard Windows DLL, you cannot reference it.", wat wil dit zeggen?

verder staat er ook nog dit:
"Calling convention
A calling convention is a scheme for how functions receive parameters from their caller and how they return a result.
Different programming languages use different calling conventions, so it is important to know which calling convention
is used by your programming language and which calling convention is used by the K8055D.DLL.
The most common calling convention is the stdcall calling convention, and this is also the one we have used for our
DLL.
"

graag wat hulp :)
Alvast bedankt!

Kenny

Het gebruik van een .lib file om "tegen" een DLL aan te linken is wel de makkelijke manier... Zo'n lib bevat alle informatie over de DLL die nodig is om de koppeling automatisch te laten leggen.

Als ik trouwens met de LIB tool een .lib bestand uit jouw .def bestand probeer te maken, lukt dat wel gewoon?

Zo'n lib bestand kun je dan aan je project toevoegen, en zou het allemaal wel moeten compilen.

Op 6 juli 2012 12:17:01 schreef KaRaMBa:
Als ik trouwens met de LIB tool een .lib bestand uit jouw .def bestand probeer te maken, lukt dat wel gewoon?

Zo'n lib bestand kun je dan aan je project toevoegen, en zou het allemaal wel moeten compilen.

Heb de "lib" tool opnieuw gebruikt en nu heb ik het .lib bestand toegevoegd aan het project (in de map Source Files).
Wanneer ik nu wil compilen krijg ik dezelfde fout:


1>------ Build started: Project: Test K8055, Configuration: Debug Win32 ------
1>  Main.cpp
1>Main.obj : error LNK2019: unresolved external symbol __imp__CloseDevice@0 referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol __imp__SetDigitalChannel@4 referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol __imp__OpenDevice@4 referenced in function _main
1>D:\documenten\projecten\K8055N\Visual C++ Projects\Test K8055\Debug\Test K8055.exe : fatal error LNK1120: 3 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Je moet het lib bestand niet alleen in je project directory plaatsen, je moet hem ook in visual studio aan je project toevoegen.

Dat kan op een aantal manieren:

  • Via "Project" -> "Add existing Item..."
  • In 1 van je C source files, ergens bovenaan
    
    #pragma comment(lib, "mylib.lib")
    

    opnemen
  • Bij de eigenschappen van je project, onder Linker -> Input de lib bij de "Additional Dependencies" opgeven

Ik heb alle drie de manieren uitgevoerd en krijg nog steeds dezelfde fout :s

Ik weet niet of je hier wat aan hebt....

Ik gebruik assembly (Masm) om de USB EXPERIMENT INTERFACE BOARD K8055N aan te sturen.
Hier een .zip met alle bestanden en sources incl. de Masm assembler.

kan je gelijk gaan programmeren.

http://members.home.nl/siekmanski/K8055Interface.exe

http://members.home.nl/siekmanski/K8055asm.zip

Dat heb je mooi gemaakt! Maar helaas ben ik hier niets mee in Visual C++... (?)

Kan iemand mij helpen met dit bord aan de praat te krijgen in Visual C++ ?

Alvast bedankt

Kenny

[Bericht gewijzigd door Henry S. op (41%)]

Volgens de omschrijving zitten er C++ voorbeelden bij. StdCall is de calling convention voor de DLL, dat lijkt wel goed te gaan te zien aan de decorated filenames ("__imp__OpenDevice@4")