Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Besoin d'un coup de main en 'C'

7 réponses
Avatar
Eric Laurent
Bonjour,

Appel au spécialistes du 'C', j'ai besoin d'un coup de main.
J'ai des sources en 'C' que je dois convertir en DLL pour être
utilisable par WinDev.
J'arrive bien à créer la DLL, mais le problème, c'est qu'elle n'a aucun
point d'entrée, donc elle est inexploitable.
Si une âme charitable pouvait m'aider, ou me compiler cette DLL, merci
de me contacter directement, je lui enverrai les sources.

Merci d'avance

Eric.

--
Eric Laurent
nospam.laurent.systel@wanadoo.fr
(enlever nospam.)

7 réponses

Avatar
Romain PETIT
Eric Laurent a émis l'idée suivante :
Bonjour,



Bonjour,

Appel au spécialistes du 'C', j'ai besoin d'un coup de main.
J'ai des sources en 'C' que je dois convertir en DLL pour être utilisable par
WinDev.
J'arrive bien à créer la DLL, mais le problème, c'est qu'elle n'a aucun point
d'entrée, donc elle est inexploitable.
Si une âme charitable pouvait m'aider, ou me compiler cette DLL, merci de me
contacter directement, je lui enverrai les sources.




Pour les points d'entréé, il faut déclarer _declspec(dllexport)

Exemple :
Vérification d'un CRC32 (_crc32Compute) est le nom de la fonction
exportée.


Code WD

FONCTION fg_VerifCRC32Fichier(fname)
crc est un entier long =0xffffffff
crc_lu est un entier long
Ch_crc_lu est une chaine fixe sur 10//"0x"+8 caract du CRC
size est un entier long
boolfin est un booleen
mh est un entier = fouvre(fname,folecture+fobinaire)
si mh<>-1 alors
buffer est une chaine fixe sur 16384 // Par bloc de 16Kb c'est déja
bien :-)
boucle
_size = flit(mh,16384,&buffer)
si _size<16384 alors
_size-=8
ch_crc_lu=("0x"+buffer[[(_size+1) à ]])
//convertir la chaine en hexa
si pas appeldll32("shlwapi","StrToIntExA",&ch_crc_lu,1,&crc_lu)
alors
Erreur("Erreur lors de la conversion hexa")
renvoyer faux
FIN
buffer=buffer[[à _size]]//on enleve la chaine CRC
boolFin=vrai
FIN
crc = appeldll32("mcrc.dll","_crc32Compute",&buffer,_size,crc)
Si boolfin alors sortir // c'etait le dernier bloc du
fichier, on
quitte
fin
fferme(mh)
fin
si crc=crc_lu alors
renvoyer vrai
sinon
renvoyer faux
fin


=====Code en C de la DLL
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define DllExport __declspec( dllexport )
DllExport unsigned long crc32Compute(unsigned char *pBuffer,unsigned
long
len,unsigned long crc);


#define UCHAR_MAX (255)
#define CHAR_BIT (8)
#define CRCPOLY 0xEDB88320L

#define UPDATE_CRC(r,c) r=crctable[ ((unsigned
char)(r))^(c)]^((r)>>CHAR_BIT)
/*#define UPDATE_CRC(r,c) crctable[ ((unsigned char)(r)) ^ ((unsigned
char)(c))
]^(r>>CHAR_BIT)*/


typedef unsigned long UCRC;


/**************************/
/* Function UpdateCRC() */
/**************************/

/*--------------------------------------------------------------------

First, the polynomial itself and its table of feedback terms. The
polynomial is
X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0

Note that we take it "backwards" and put the highest-order term in
the lowest-order bit. The X32 term is "implied"; the LSB is the
X31 term, etc. The X0 term (usually shown as "+1") results in
the MSB being 1.

Note that the usual hardware shift register implementation, which
is what we're using (we're merely optimizing it by doing eight-bit
chunks at a time) shifts bits into the lowest-order term. In our
implementation, that means shifting towards the right. Why do we
do it this way? Because the calculated CRC must be transmitted in
order from highest-order term to lowest-order term. UARTs transmit
characters in order from LSB to MSB. By storing the CRC this way,
we hand it to the UART in the order low-byte to high-byte; the UART
sends each low-bit to hight-bit; and the result is transmission bit
by bit from highest- to lowest-order term without requiring any bit
shuffling on our part. Reception works similarly.

The feedback terms table consists of 256, 32-bit entries. Notes:

The table can be generated at runtime if desired; code to do so
is shown later. It might not be obvious, but the feedback
terms simply represent the results of eight shift/xor opera-
tions for all combinations of data and CRC register values.

The values must be right-shifted by eight bits by the "updcrc"
logic; the shift must be unsigned (bring in zeroes). On some
hardware you could probably optimize the shift in assembler by
using byte-swap instructions.
polynomial $edb88320


--------------------------------------------------------------------*/

static UCRC crctable[UCHAR_MAX + 1]{
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
0x2d02ef8dL
};

/* Bon à savoir: voici une méthode pour calculer la table
(mais dans le cas de la DLL mieux vaut l'avoir déjà en statique
comme

ici)*/
/*
void make_crctable(void)
{
int i, j;
UCRC r;


for (i = 0; i <= UCHAR_MAX; i++) {
r = i;
for (j=CHAR_BIT;j>0;j--) {
if (r & 1)
r=(r>>1)^CRCPOLY;
else
r>>=1;
}
crctable[i]=r;
}
}
*/

unsigned long crc32Compute(unsigned char *pBuffer,unsigned long
len,unsigned long
crc)
{

/*if (crc = 0)
{
crc=0xffffffff;
}*/

if ((len>0) && (pBuffer))
{
do
{
UPDATE_CRC(crc,*pBuffer++);
}
while (--len);
}
return crc;
}

/* fin du source */

--
Romain PETIT
contact : rompetit chez free fr
+-+ posté sur Usenet avec MesNews et non depuis un forum web +-+
news:fr.comp.developpement.agl.windev
http://www.mesnews.net/
http://fr.wikipedia.org/wiki/Newsgroup
Avatar
Eric Laurent
Merci Romain de te pencher sur mon problème.
Hélas mes connaissances et outils en 'C' ne m'ont pas permis d'y
arriver.
Je me permets de t'envoyer les sources en privé si tu pouvais faire
quelque chose, je t'en serais extrêmement reconnaissant.

Très cordialement,

Eric

--
Eric Laurent

(enlever nospam.)
Avatar
Romain PETIT
Eric Laurent avait prétendu :
Merci Romain de te pencher sur mon problème.
Hélas mes connaissances et outils en 'C' ne m'ont pas permis d'y arriver.
Je me permets de t'envoyer les sources en privé si tu pouvais faire quelque
chose, je t'en serais extrêmement reconnaissant.



Bonjour,

déolé pas trop le temps de me pencher là-dessus (NB : c'est du C++ et
non du C).

Peux-être ferais-tu mieux d'utiliser un autre source, par exemple
celui-ci qui comporte les sources et une DLL compilée ainsi que des
exemples en C et en VB :
http://www.wizardwrx.com/FREEBIES/P6CryptAES.html

A+

--
Romain PETIT
contact : rompetit chez free fr
+-+ posté sur Usenet avec MesNews et non depuis un forum web +-+
news:fr.comp.developpement.agl.windev
http://www.mesnews.net/
http://fr.wikipedia.org/wiki/Newsgroup
Avatar
Eric Laurent
Dans son message précédent, Romain PETIT a écrit :

Peux-être ferais-tu mieux d'utiliser un autre source, par exemple celui-ci
qui comporte les sources et une DLL compilée ainsi que des exemples en C et
en VB :
http://www.wizardwrx.com/FREEBIES/P6CryptAES.html

A+



Merci Romain.
Je connais cette DLL et je n'ai pas pu l'utiliser pleinement sous
Windev car pour les chaines dépassant 16 octets, la fonction
decryptstring par exemple retourne l'adresse d'une chaine qui ne
contient que les 16 derniers caractères (les précédents sont effacés).
Je pense qu'il faut utiliser une variable de type 'stream' que je
n'arrive pas à adapter en WinDev.

--
Eric Laurent

(enlever nospam.)
Avatar
PYT
Le 03/11/2010 10:37, Eric Laurent a écrit :
Bonjour,

Appel au spécialistes du 'C', j'ai besoin d'un coup de main.
J'ai des sources en 'C' que je dois convertir en DLL pour être
utilisable par WinDev.
J'arrive bien à créer la DLL, mais le problème, c'est qu'elle n'a aucun
point d'entrée, donc elle est inexploitable.
Si une âme charitable pouvait m'aider, ou me compiler cette DLL, merci
de me contacter directement, je lui enverrai les sources.

Merci d'avance

Eric.



Si tu veux je jette un oeil à ta dll

As tu pensé à mettre un extern "C" pour eviter la decoration des noms ?

PYT
Avatar
patrice
Ajoute le declspec

extern "C" {
__declspec(dllexport) int fonction1();
__declspec(dllexport) int fonction2();
}


Le 06/11/2010 16:00, PYT a écrit :
Le 03/11/2010 10:37, Eric Laurent a écrit :
Bonjour,

Appel au spécialistes du 'C', j'ai besoin d'un coup de main.
J'ai des sources en 'C' que je dois convertir en DLL pour être
utilisable par WinDev.
J'arrive bien à créer la DLL, mais le problème, c'est qu'elle n'a aucun
point d'entrée, donc elle est inexploitable.
Si une âme charitable pouvait m'aider, ou me compiler cette DLL, merci
de me contacter directement, je lui enverrai les sources.

Merci d'avance

Eric.



Si tu veux je jette un oeil à ta dll

As tu pensé à mettre un extern "C" pour eviter la decoration des noms ?

PYT
Avatar
Eric Laurent
Merci Romain, Pierre-Yves et Patrice de vous être penchés sur le sujet.

Mon problème a été résolu par un collègue.
J'ai maintenant une belle Dll qui fait exectement ce dont j'ai besoin.

Merci encore,

Eric

--
Eric Laurent

(enlever nospam.)