Pourquoi ces erreurs de compilation sous visual studio ?

Signaler
Messages postés
2
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
17 juin 2004
-
Messages postés
2
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
17 juin 2004
-
sous visual .net j'ai ces 3 erreurs:

network.c(112) : error C2420: 'strlen' : symbole non conforme dans premier opérande

network.c(112) : error C2415: type d'opérande incorrect

et :
netbios.c(193) : warning C4133: 'fonction' : types incompatibles - de 'unsigned short *' à 'LPCSTR'

pour cette portion de code network.c ,pourquoi strlen pose problème ? :

int rsend(SOCKET mysock, const char *buffer)
{
unsigned int len;

__asm {
mov eax, [buffer]
push eax
call strlen // get len of the buffer
mov len, eax // len = strlen(buffer);
add esp, 4
xor eax, eax
push eax
mov eax, [len]
push eax
mov eax, [buffer]
push eax
mov eax, [mysock]
push eax
call send // call send function
push eax
call Proc_Error
add esp, 4
}

return(0);
}

et pour le netbios.c:

cette partie du code:

if (!*server)
{
Proc_help("enumserver");
return -1;
}

pszServerName = AsWideString(server);

nStatus = NetServerEnum((unsigned short *)pszServerName, dwLevel, (LPBYTE *) &pBuf, dwPrefMaxLen, &dwEntriesRead,&dwTotalEntries, dwServerType,NULL,&dwResumeHandle);

buffer = (char *)MyHeapAlloc(BUF_MAXLEN);
if ((nStatus NERR_Success) || (nStatus ERROR_MORE_DATA))
{
if ((pTmpBuf = pBuf) != NULL)
{
for (i = 0; i < dwEntriesRead; i++)
{
assert(pTmpBuf != NULL);

if (pTmpBuf == NULL)
{
DisplayMessage("An access violation has occurred.", 0);
break;
}

sprintf(buffer, "\tPlatform: %d\n", pTmpBuf->sv101_platform_id);
sprintf(buffer, "%s\tName: %s\n", buffer, pTmpBuf->sv101_name);
sprintf(buffer, "%s\tVersion: %d.%d\n", buffer, pTmpBuf->sv101_version_major, pTmpBuf->sv101_version_minor);
sprintf(buffer, "%s\tType: %d", buffer, pTmpBuf->sv101_type);
rsend(ConnectSocket, buffer);

if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_CTRL)
rsend(ConnectSocket, " (PDC)");

else if (pTmpBuf->sv101_type & SV_TYPE_DOMAIN_BAKCTRL)
rsend(ConnectSocket, " (BDC)");

rsend(ConnectSocket, "\n");

sprintf(buffer ,"\tComment: %s\n\n", pTmpBuf->sv101_comment);
rsend(ConnectSocket, buffer);

pTmpBuf++;
dwTotalCount++;
}

if (nStatus == ERROR_MORE_DATA)
{
rsend(ConnectSocket, "\nMore entries available!!!\n");
sprintf(buffer, "Total entries: %d", dwTotalEntries);
rsend(ConnectSocket, buffer);
}
sprintf(buffer, "\nEntries enumerated: %d\n", dwTotalCount);
rsend(ConnectSocket, buffer);
}
}
else
sprintf(buffer, "Error: A system error has occurred: %s\n", DisplayError());
rsend(ConnectSocket, buffer);
if (pBuf != NULL)
NetApiBufferFree(pBuf);

MyHeapFree(buffer);

return(0);
}

3 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
strlen est une MACRO valide dans du code C/C++.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
22
salut

premiere erreur : tu ne peux pas utiliser strlen dans de l'asm pour la raison que BruNews a écrit. Il faut donc que tu mettes
len = strlen(buffer);
avant _asm

seconde erreur : la doc msdn indique que le premier parametre de NetServerEnum doit etre un LPCSTR et non un pointeur vers un unsigned short. Il faut donc que tu mettes dans ton code :
nStatus = NetServerEnum(pszServerName, dwLevel, (LPBYTE *) &pBuf, dwPrefMaxLen, &dwEntriesRead,&dwTotalEntries, dwServerType,NULL,&dwResumeHandle);

voilà

ShareVB
Messages postés
2
Date d'inscription
dimanche 19 octobre 2003
Statut
Membre
Dernière intervention
17 juin 2004

merci à vous deux pour ces explications très complètes