Full translation of article from here

function TShelRAS.RasDialEx(_ConnectionName, _ConnectionUser, _ConnectionPass: string): boolean;
var
  nRet: DWORD;
  TempEntryName: RASENTRYNAME;
  EntryBufferSize: DWord;
  EntryWritten: DWord;
  StrErr: string;
  RasEntryNameArray: array of RASENTRYNAME;
  GPRSEntry: integer;
  VRasEntry: RASENTRY;
  dwEntrySize: DWord;
  Buffer: array[0..4098] of char;
  dwBufferSize: DWord;
  iEntry: integer;
  RASDialParameters: RASDIALPARAMS;
  bPassword: BOOL;
  RasRc: DWord;

begin
  try
  TempEntryName.dwSize := sizeof(RASENTRYNAME);
  EntryBufferSize := sizeof(TempEntryName);
  EntryWritten := 0;

  // LogIt(-1, Format ('RasEnumEntries %d', [EntryBufferSize]));
  nRet := RasEnumEntries(nil, nil, @TempEntryName, @EntryBufferSize, @EntryWritten);
  if (nRet <> ERROR_BUFFER_TOO_SMALL) then begin
    StrErr := Format('RasEnumEntries failed: Error %d', [nRet]);
    LogIt(nRet, StrErr);
    Result := False;
    exit;
  end;
  SetLength(RasEntryNameArray, EntryBufferSize);  // DEBUG
  try
    RasEntryNameArray[0].dwSize := sizeof(RASENTRYNAME);
    // LogIt(-1, Format ('RasEnumEntries, EntryWritten:%d', [EntryWritten] ));
    nRet := RasEnumEntries(nil, nil, @RasEntryNameArray[0], @EntryBufferSize, @EntryWritten);
    if (nRet <> 0) then begin
      StrErr := Format('RasEnumEntries failed: Error %d', [nRet]);
      if assigned(RepErrFunc) then begin
        RepErrFunc(nRet, StrErr);
      end;
      Result := False;
      exit;
    end;

    GPRSEntry := -1;
    fillchar(VRasEntry, sizeof(RasEntry), #0);
    VRasEntry.dwSize := sizeof(RasEntry);
    dwEntrySize := sizeof(RasEntry);

    memset(@Buffer, #0, sizeof(Buffer));
    dwBufferSize := sizeof(Buffer);

    for ientry := 0 to EntryWritten-1 do begin
      LogIt(0, 'RasName:' +  RasEntryNameArray[iEntry].szEntryName);
      // Check if the name has GPRS in it
      // AND
      // if Local Phone Number contains "~GPRS!"
      // LogIt(-1, 'RasGetEntryProperties');
      nRet := RasGetEntryProperties(nil, RasEntryNameArray[iEntry].szEntryName, @VRasEntry, @dwEntrySize, nil, nil);
      if (nRet <> 0) then begin
        StrErr := Format('RasGetEntryProperties failed: Error %d', [nRet]);
        if assigned(RepErrFunc) then begin
          RepErrFunc(nRet, StrErr);
        end;
        Result := False;
        exit;
      end;
      LogIt(0, 'Phone..:' +  VRasEntry.szLocalPhoneNumber);

      if (wcsstr(VRasEntry.szLocalPhoneNumber, '111') <> nil) then begin // search for dialnr - our way og checking if connection is ras
        // Found -> RAS entry is GPRS
        GPRSEntry := iEntry;
        break;
      end;
    end;
    if GPRSEntry <> -1 then begin
      Logit(0, 'Connect to:' + RasEntryNameArray[GPRSEntry].szEntryName);
      // LogIt(-1, 'RasGetEntryProperties');
      nRet := RasGetEntryProperties(nil, RasEntryNameArray[GPRSEntry].szEntryName, @VRasEntry,
        @dwEntrySize, @Buffer, @dwBufferSize);
      if (nRet <> 0) then begin
        StrErr := Format('RasGetEntryProperties failed: Error %d', [nRet]);
        if assigned(RepErrFunc) then begin
          RepErrFunc(nRet, StrErr);
        end;
        Result := False;
        exit;
      end;

      // Configure the RASDIALPARAMS structure

      fillchar(RASDialParameters, sizeof(RASDIALPARAMS), #0);

      RASDialParameters.szPhoneNumber[0] := #0;
      RASDialParameters.szCallbackNumber[0] := #0;
      RASDialParameters.dwSize := sizeof(RASDIALPARAMS);
      RASDialParameters.szEntryName := RasEntryNameArray[GPRSEntry].szEntryName;
      RASDialParameters.szUserName := 'username' + #0;
      RASDialParameters.szPassword := 'password' + #0;
      RASDialParameters.szDomain[0] := #0;

      // LogIt(-1, 'RasGetEntryDialParams');
      nRet := RasGetEntryDialParams(nil, @RASDialParameters, @bPassword);
      if (nRet <> 0) then begin
        StrErr := Format('RasGetEntryDialParams failed: Error %d', [nRet]);
        if assigned(RepErrFunc) then begin
          RepErrFunc(nRet, StrErr);
        end;
        Result := False;
        exit;
      end;
      Logit(0, 'DIAL start (be patient)..');
      RasRc := RasDial(nil, nil, @RASDialParameters, 0, nil, @VRASConnection);
      Logit(RasRc, Format('DIAL done, rc: %d', [RasRc]));
      if (RasRc <> 0) then begin
        StrErr := Format('Could not connect using RAS', []);
        LogIt(RasRc, StrErr);
        VRASConnection := 0;
        Result := False;
        exit;
      end;
      Result := True;
    end else begin
      Logit(ERROR_PORT_NOT_FOUND, 'Error: No GPRS connection found!');
      Result := False;
    end;
  finally
    SetLength(RasEntryNameArray, 0);
  end;
  except
    on E: exception do begin
      Logit ( -1, 'ERROR:' + E.Message );
    end;
  end;
  //  Try to establish RAS connection.
end;

My problem was with:

nRet := RasEnumEntries(nil, nil, @RasEntryNameArray[0], @EntryBufferSize, @EntryWritten);

since first call 

nRet := RasEnumEntries(nil, nil, @TempEntryName, @EntryBufferSize, @EntryWritten);

Initialize variables, and second call actually enumerates RAS entries, asnd I didn't know that parameter should be called with @RasEntryNameArray[0]