Pourquoi ces erreurs de compilation sous visual studio ?

cs_bock Messages postés 2 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 17 juin 2004 - 17 juin 2004 à 18:10
cs_bock Messages postés 2 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 17 juin 2004 - 17 juin 2004 à 19:32
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 juin 2004 à 18:34
strlen est une MACRO valide dans du code C/C++.

ciao...
BruNews, Admin CS, MVP Visual C++
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
17 juin 2004 à 18:44
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
0
cs_bock Messages postés 2 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 17 juin 2004
17 juin 2004 à 19:32
merci à vous deux pour ces explications très complètes
0
Rejoignez-nous