[ Predrag Glumac @ 21.10.2008. 20:25 ] @
Pozdrav svima.

Imam problem sa funkcijom RasEnumConnections - cak i kada pokusam da proverim neophodnu velicinu RASCONN strukture vraca mi gresku 0x278 (ERROR_INVALID_SIZE) !?

Code:

DWORD nErr, nSize = 0, nCount = 0;
nErr = RasEnumConnections(NULL, &nSize, &nCount);


Radim u Visual Studio 2008, OS je Windows XP SP2 (probao sam na dve masine i isti rezultat, jedna test masina nema VS ali ima otvorenu konekciju ka internetu preko ISDN modema) i vraca mi istu gresku. Gledao sam po internetu, svugde gde se spominje ta greska je u kontekstu W2K. Probao sam Unicode i Ansi, i ista je greska. Mozda nesto znaci, ali RasEnumDevices radi bez greske.

Da li neko zna u cemu moze biti problem ? Hvala.
[ savkic @ 22.10.2008. 09:13 ] @
Prosleđuješ pogrešne argumente, prvi ne sme biti NULL. Pogledaj primer u MSDNu.
[ Predrag Glumac @ 22.10.2008. 10:01 ] @
Tja, po on-line MSDN-u (http://msdn.microsoft.com/en-us/library/aa377284(VS.85).aspx) se tako radi provera neophodna velicina bafera, i tako stoji u primeru.

Citat:
To determine the required buffer size, call RasEnumConnections with lprasconn set to NULL. The variable pointed to by lpcb should be set to zero. The function will return the required buffer size in lpcb and an error code of ERROR_BUFFER_TOO_SMALL


Ali cak kada napravim niz RASCONN struktura sa 100 elemenata, i postavim dwSize clan prvog elementa na velicinu RASCONN strukture, dobijam istu gresku.
[ nikomak @ 22.10.2008. 11:47 ] @
Ovako nekako, vs2008, vista, radi bez problema.

Code:

#include <windows.h>
#include <stdio.h>
#include "ras.h"
#include "raserror.h"

int main(int argc, char **argv)
{
    DWORD i;
    LPRASCONN lpRas = NULL;
    DWORD nBufSize = 0;
    DWORD nNumCon = 0;
    DWORD nRet = 0;

    nRet = RasEnumConnections(lpRas, &nBufSize, &nNumCon);

    if (nRet == ERROR_BUFFER_TOO_SMALL) {
        lpRas = (LPRASCONN) malloc(nBufSize);
        if (lpRas == NULL) {
           ExitProcess(GetLastError());
        }
        lpRas[0].dwSize = sizeof(RASCONN);
        nRet = RasEnumConnections(lpRas, &nBufSize, &nNumCon);
        if (nRet == ERROR_SUCCESS) {
            for (i = 0; i < nNumCon; i++) {
            wprintf(L"Active connection: %s\n", lpRas[i].szEntryName);
            }
        } else {
            wprintf(L"err: %d\n", GetLastError());
        }
        free(lpRas);
    }
    return 0;
}
[ Predrag Glumac @ 22.10.2008. 12:09 ] @
Nope, vraca 0x278 Prosto neverovatno, probao sam na par XP masina i isto ......
[ nikomak @ 22.10.2008. 13:56 ] @
Hmm, ovaj error koji vraca (632) ustvari oznacava da struct dwsize nije dobar i da se koristi nepoznata verzija structa, koliko sam shvatio.
Probaj da iznad #include "ras.h" dodas

Code:

#define  WINVER 0x501


da bi oznacio da se koristi verzija structa za xp, mislim da je u tome problem.
[ Predrag Glumac @ 22.10.2008. 20:47 ] @
Hvala na ideji. Pretpostavljao sam da je to problem, ali cak i kada promenim verziju sa 0x600 na 0x501 (pa i na manje verzije koje su navedene u #if uslovima RASCON strukture) nikako ne mogu da dobijem neophodnu velicinu bafera - opet ista greska ERROR_INVALID_SIZE.
Medjutim, ako stavim da je verzija 0x501 (RASCON struktura bez clana guidCorrelationId) i ako ne pokusam da dinamicki alociram RASCONN bafer, vec postavim na neku fiksnu duzinu, onda makar dobijem aktivne konekcije ! Nije idealo resenje, ali u nedostaku boljeg ce posluziti.

Hvala jos jednom
[ savkic @ 23.10.2008. 09:20 ] @
> Tja, po on-line MSDN-u (http://msdn.microsoft.com/en-us/library/aa377284(VS.85).aspx) se tako radi
> provera neophodna velicina bafera, i tako stoji u primeru.

To je promenjeno u odnosu na verziju koju ja imam, tu se nigde ne spominje NULL. Možda je to dograđeno za Vistu. Elem, ovo je kod koji ja koristim oko 8 godina i to bez problema:

Code:

var
  dwRet: DWORD;
  nCB: DWORD;
  Buf: array [0..255] of Char;
  aRasConn: array [0..10] of TRASCONN;
  nRasConnCount   : DWORD;
begin
  aRasConn[0].dwSize := SizeOf(aRasConn[0]);
  nCB   := SizeOf(aRasConn);
  dwRet := RasEnumConnectionsA(@aRasConn, @nCB, @nRasConnCount);
  if dwRet <> 0 then
  begin
    RasGetErrorStringA(dwRet, @Buf[0], SizeOf(Buf));
    Status([coLog], Buf);
  end;