[C++/VB] Hoe bruikbare Class library maken van .h & .c files

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 06-09 16:30
Ik ben nu al een tijd aan het uitzoeken en proberen hoe ik van een .h file en een .c file voor Visual Basic bruikbare classes kan maken.
Visual Studio C++ geinstalleerd, maar ik kom er niet uit :(

De bron van de voor mij benodigde files staat hier... En de benodige MGRS-only users voor windows zip hier...

Ik heb ook de developer versie gedownload (trouwens alle versies voor windows), maar ook daar wordt ik niet veel wijzer van.

Het enige wat gelukt is om te builden is een .lib file (Object File Library), maar die kan ik niet gebruiken...

Wie kan mij (op weg) helpen?

[ Voor 14% gewijzigd door Swerfer op 25-01-2008 19:02 ]

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:45
-> PRG

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Je kunt naar een dll compileren en die vanuit VB gebruiken. Moet je trouwens wel C calling convention gebruiken.

[edit]
en __stdcall

[ Voor 9% gewijzigd door farlane op 26-01-2008 02:27 ]

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.


Acties:
  • 0 Henk 'm!

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

MLM

aka Zolo

1) configureer je linker om een DLL te targetten
2) configureer je compiler om C code (niet c++) te compilen, OF maak alles
code:
1
extern "C" { /*alles */ }

3) configureer je linker om bepaalde symbols te exporten OF maak prefix de functies die je wilt exporteren met
code:
1
__declspec(dllexport)


voorbeeld van iets simpels:

.h file
C++:
1
2
3
4
extern "C"
{
__declspec(dllexport) int foo(void);
}


.c(pp) file
C++:
1
2
3
4
5
#include ".h file"
int foo(void)
{
  return 42;
}


VB code (dit doe ik nooit, een quick google)
Visual Basic .NET:
1
Declare Function foo Lib "jedll.dll" () As Long

[ Voor 34% gewijzigd door MLM op 26-01-2008 01:07 ]

-niks-


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 06-09 16:30
Ik heb eens geprobeert te compilen naar een DLL, met onderstaand resultaat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin>cl "C:\Documents and Setting
s\blabla\Bureaublad\dt_cc\mgrs\mgrs.c" /LDd
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.20706.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

mgrs.c
Microsoft (R) Incremental Linker Version 9.00.20706.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:mgrs.dll
/dll
/implib:mgrs.lib
mgrs.obj
mgrs.obj : error LNK2019: unresolved external symbol _Convert_Geodetic_To_UTM re
ferenced in function _Convert_Geodetic_To_MGRS
mgrs.obj : error LNK2019: unresolved external symbol _Set_UTM_Parameters referen
ced in function _Convert_Geodetic_To_MGRS
mgrs.obj : error LNK2019: unresolved external symbol _Convert_Geodetic_To_UPS re
ferenced in function _Convert_Geodetic_To_MGRS
mgrs.obj : error LNK2019: unresolved external symbol _Set_UPS_Parameters referen
ced in function _Convert_Geodetic_To_MGRS
mgrs.obj : error LNK2019: unresolved external symbol _Convert_UPS_To_Geodetic re
ferenced in function _Convert_MGRS_To_Geodetic
mgrs.obj : error LNK2019: unresolved external symbol _Convert_UTM_To_Geodetic re
ferenced in function _Convert_MGRS_To_Geodetic
mgrs.dll : fatal error LNK1120: 6 unresolved externals

Na zoekwerk naar error LNK2019 ben ik helaas niet tot een oplossing gekomen.

Het is toch lastiger om een bruikbare DLL te genereren dan ik dacht...

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Het is niet moeilijker dan het maken van een applicatie, ook daar moet je zorgen dat je de juiste object files en libraries meelinked.

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.


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 06-09 16:30
farlane schreef op zaterdag 26 januari 2008 @ 14:01:
Het is niet moeilijker dan het maken van een applicatie, ook daar moet je zorgen dat je de juiste object files en libraries meelinked.
Dat is dus mijn probleem, ik heb nog nooit C++ geprogrammeerd, alleen VB. Ik dacht dat ik er wel uit kon komen, maar ik mis de basis voor C++ al...

En de C++ source die ik wil gebruiken is te groot en te ingewikkeld om het zelf om te zetten naar VB, dus dacht dat ik 'gewoon' maar even moest compileren en de DLL als reference toevoegen aan mijn VB project.
Dat 'gewoon' valt mij vies tegen...

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


Acties:
  • 0 Henk 'm!

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 11:15
Na zoekwerk naar error LNK2019 ben ik helaas niet tot een oplossing gekomen
Eindelijk weer eens iemand die zelf iets probeerd. :). Helaas zul je op deze fout niets specifieks vinden.

Unresolved external symbol X referenced in function Y wil zeggen dat functie Y een functie gebruikt waarvan hij de source code (object file, of .c file) niet kan vinden. Deze heb je waarschijnlijk niet meegelinkt.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Swerfer schreef op zaterdag 26 januari 2008 @ 14:43:
Dat is dus mijn probleem, ik heb nog nooit C++ geprogrammeerd, alleen VB.
Dat maakt op zich niet uit, het compilatieproces is hetzelfde, alhoewel VB veel van de details voor je verbergt.

Het idee achter een compilatie is ongeveer:
A pak een module ( .cpp in C++ of .bas/.cls/whatever in VB )
B compileer deze naar een object file ( .obj in zowel C++ als VB onder Windows )
C herhaal voor alle modules in je project
D voeg eventuele libraries toe
E link alle functieaanroepen naar het juiste functieadres in de juiste object file
F Voeg de startup code toe
G Klaar

Je zou voor de grap tijdens het compileren van je VB applicatie eens moeten kijken naar de directory waar je je project hebt staan, dan zie je de object files wel langskomen :)

Jij hebt nu het probleem dat de linker tijdens stap E functies niet kan vinden die wel gebruikt worden.

Als voorbeeld: Convert_Geodetic_To_MGRS gebruikt een functie Convert_Geodetic_To_UTM die de linker niet kan vinden, omdat de module niet wordt meegecompileerd naar een object file of omdat een eventuele library waarin die functie staat niet wordt opgegeven om te worden meegelinked.

Dus of je project is niet compleet ( .c file vergeten? ), of je linked bepaalde libraries niet mee.


BTW, een bestand met de extensie .c wordt door de MS compiler naar C code gecompileerd, niet naar C++ code.

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.


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 06-09 16:30
Ik ben wel een stap verder gekomen. Ik heb alle functie-verwijzingen die de fout aangaven verwijderd, en daarna gecompileerd. Daarmee heb ik een werkende DLL gekregen. Natuurlijk werken de functies waarbij ik de verwijzingen heb verwijderd niet meer...

Maar ik ben al blij dat een deel van de functies WEL werken, en kan gebruiken vanuit VB...

Ik heb verder van alles geprobeerd om de overige functies wel werkend te krijgen, maar zoals jullie zeggen mis ik waarschijnlijk een link. (Ik heb ALLE .h en .c en .obj files gekopieerd die in de downloads in de TS stonden, maar dat maakte niks uit)

Helaas kom ik daar niet meer uit en wil ik vragen of iemand kan kijken of hij met de downloads in de TS wel de mgrs.c kan compileren, liefst met de visual studio 2008 command line compiler en mij kan uitleggen hoe ik hetzelfde resultaat kan genereren...

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


Acties:
  • 0 Henk 'm!

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

MLM

aka Zolo

mja, LNK2019 betekent dat de linker een referentie niet kan vinden.
deze code gaat bijvoorbeeld wel compilen, maar niet linken:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
//Forward declaration
void bar();

void foo()
{
   bar();
}

void main()
{
   foo();
}

je gaat een LNK2019 krijgn omdat bar niet gevonden gaat worden. Om dit op te lossen moet je een .obj of .lib extra linken waar de bar() functie in staat.

zelfde is bij jou het geval, je mist een paar functies, die wel nodig zijn. het meest waarschijnlijke is dat je een c file niet compileert, waardoor een .obj mist. Check of je alle files hebt, en of je al deze files ook echt laat compileren, en of die allemaal succesvol zijn. Ga dan pas linken (MSVC doet dit voor je)

-niks-


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Swerfer schreef op zaterdag 26 januari 2008 @ 17:36:
Helaas kom ik daar niet meer uit en wil ik vragen of iemand kan kijken of hij met de downloads in de TS wel de mgrs.c kan compileren, liefst met de visual studio 2008 command line compiler en mij kan uitleggen hoe ik hetzelfde resultaat kan genereren...
De functie Convert_Geodetic_To_UTM bijvoorbeeld staat in utm.c.

Een goede indicatie is dat vanuit jouw mgrs.c dit wordt gedaan:

C:
1
2
#include "ups.h"
#include "utm.h"


Maw, de functies die de linker zoekt zitten in ups.c en utm.c. Als jij op de commandline deze twee meegeeft naast mgrs.c dan zal het ongetwijfeld werken.

Het handigst is trouwens om even een projectje of makefile te maken.

[edit]
ups.c en utm.c gebruiken functies uit de andere source files zie ik nu .... je moet dus zo ongeveer alle source files die in de verschillende paden staan in je project invoegen.

[ Voor 14% gewijzigd door farlane op 27-01-2008 15:02 ]

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.


Acties:
  • 0 Henk 'm!

  • lzandman
  • Registratie: November 2000
  • Niet online
Als ik jou was zou ik op zoek gaan naar een alternatief. Die is er vast wel.

What's the speed of Dark?


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
lzandman schreef op zondag 27 januari 2008 @ 00:24:
Als ik jou was zou ik op zoek gaan naar een alternatief. Die is er vast wel.
En de reden daarvoor is? Omdat het compilen niet meteen lukt?

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.


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 06-09 16:30
farlane schreef op zondag 27 januari 2008 @ 00:11:
[...]
Maw, de functies die de linker zoekt zitten in ups.c en utm.c. Als jij op de commandline deze twee meegeeft naast mgrs.c dan zal het ongetwijfeld werken.
Bedankt, door het toevoegen van onder andere ups.c en utm.c werkte het perfect _/-\o_

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Swerfer schreef op zondag 27 januari 2008 @ 15:54:
Bedankt, door het toevoegen van onder andere ups.c en utm.c werkte het perfect _/-\o_
Graag gedaan :)

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.


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 06-09 16:30
Nou heb ik dus eindelijk een DLL die ik kan gebruiken, loop ik weer tegen een ander probleem aan:

Ik gebruik onderstaande code om een functie uit de DLL te declareren:
Visual Basic .NET:
1
2
3
Private Declare Function Convert_Geodetic_To_MGRS Lib "mgrs" _
  (ByVal latitude As Double, ByVal longitude As Double, _
  ByVal precision As Long, ByRef MGRS() As Char) As Long

En onderstaande code om de functie aan te roepen:
Visual Basic .NET:
1
2
3
Dim MGRS(100) As Char
Dim dummy As Long = Convert_Geodetic_To_MGRS(35.0, -75.0, 5, MGRS)
Label16.Text = New String(MGRS)

Het probleem is dat ik geen resultaat in MGRS krijg.

Ik ben begonnen met bij de declaratie ByRef MGRS as String, via ByRef MGRS() as Byte tot ByRef MGRS() as Char.

Ik dacht omdat de C-functie een Char array gebruikt, dat de laatste wel moest werken, maar nee...

Hieronder een stukje C uit de MGRS.h source:
C:
1
2
3
4
__declspec(dllexport)   long Convert_Geodetic_To_MGRS (double Latitude,
                                 double Longitude,
                                 long   Precision,
                                 char *MGRS);


Wat zie ik over het hoofd?

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Het kan geen Char zijn omdat een Char 2 bytes is terwijl een C char 1 byte is.

In VB6 zou het zijn :

Visual Basic:
1
2
3
Private Declare Function Convert_Geodetic_To_MGRS Lib "mgrs" _
  (ByVal latitude As Double, ByVal longitude As Double, _
  ByVal precision As Long, ByVal MGRS As String) As Long


Omdat de VB6 runtime automatisch vertaald tussen Unicode( wat hij intern gebruikt ) en C style strings, en ook automagisch het adres van de string meegeeft. ( strings in VB6 hebben een lengte voor de eigenlijke data staan )

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.


Acties:
  • 0 Henk 'm!

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 06-09 16:30
farlane schreef op maandag 28 januari 2008 @ 11:47:
Het kan geen Char zijn omdat een Char 2 bytes is terwijl een C char 1 byte is.

In VB6 zou het zijn :

Visual Basic:
1
2
3
Private Declare Function Convert_Geodetic_To_MGRS Lib "mgrs" _
  (ByVal latitude As Double, ByVal longitude As Double, _
  ByVal precision As Long, ByVal MGRS As String) As Long


Omdat de VB6 runtime automatisch vertaald tussen Unicode( wat hij intern gebruikt ) en C style strings, en ook automagisch het adres van de string meegeeft. ( strings in VB6 hebben een lengte voor de eigenlijke data staan )
Dat had ik als eerste geprobeerd, maar dat werkt niet.

Ook via Google kom ik tot de conclusie dat het wel zo zou moeten werken. Ik ga nog eens kijken of ik iets met het compileren ben vergeten...

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com

Pagina: 1