faqs.org.ru

 Главная > Программирование > Программирование в Windows >

Win32 API FAQ

Секция 2 из 3 - Предыдущая - Следующая
Все секции - 1 - 2 - 3

  itoa(binIp[0], dot, 10);
  strcat(result,dot);
  binIp[1] = (BYTE)((ipHO & 0x00ff0000) >> 16);
  itoa(binIp[1], dot, 10);
  strcat(result, "."); strcat(result, dot);
  binIp[2] = (BYTE)((ipHO & 0x0000ff00) >> 8);
  itoa(binIp[2], dot, 10);
  strcat(result, "."); strcat(result, dot);
  binIp[3] = (BYTE)(ipHO & 0x000000ff);
  itoa(binIp[3], dot, 10);
  strcat(result,"."); strcat(result, dot);
  strcat(result,"\r\n");
  i++;
 } while ((pIpNO != NULL) && (iterations < 6));
 WSACleanup();
      PostQuitMessage(0);
 return;
}

15)--------------------------------------------------------------------------

 Q> Как определить тип Windows на компьютере?
 A>

bool OsTypeNT(void)
{
        OSVERSIONINFO vi;

        vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx(&vi);
        if (vi.dwPlatformId==VER_PLATFORM_WIN32_NT)
        return true;

        return false;
}

16)--------------------------------------------------------------------------

 Q> Как подключить сетевой диск?
 A>

DWORD ConnectRemoteDrive(LPSTR ShareName,LPSTR LocalDrive)
{
NETRESOURCE nr;
ZeroMemory(&nr,sizeof(nr));

    nr.dwScope=RESOURCE_GLOBALNET;
    nr.dwType=RESOURCETYPE_DISK;//RESOURCETYPE_ANY;
    nr.dwDisplayType=RESOURCEDISPLAYTYPE_GENERIC;
    nr.dwUsage=RESOURCEUSAGE_CONNECTABLE;
    nr.lpLocalName=LocalDrive;
    nr.lpRemoteName=ShareName;
    nr.lpComment="";
    nr.lpProvider=NULL;

    return WNetAddConnection2(&nr, // NETRESOURCE from enumeration
    (LPSTR) NULL,             // no password
    (LPSTR) NULL,             // logged-in user
    CONNECT_UPDATE_PROFILE);  // update profile with connect info

}

17)-------------------------------------------------------------------------

 Q> А как его отключить?
 A> WNetCancelConnection2(LPSTR LocalDrive,CONNECT_UPDATE_PROFILE,TRUE);


18)-------------------------------------------------------------------------

 Q> Как послать сообщение юзеру(а-ля net send)
 A>

 Вариант 1:

 NET_API_STATUS x=NetMessageBufferSend(
                 LPTSTR servername,
         LPTSTR msgname,
         LPTSTR fromname,
         LPBYTE buf,
         DWORD buflen
           );

 Вариант 2:

From: "Alexandr Shandra" <entryway@astral.ntu-kpi.kiev.ua>

Можно через CreateFile/WriteFile, но в этом случае можно послать сообщение
только компьютеру либо на локальную рабочую группу.

Вот пример:(работает как под NT так и под 9x);

HANDLE hSlot = CreateFile("\\\\computername\\mailslot\\messngr",
    GENERIC_WRITE, FILE_SHARE_READ, NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hSlot != INVALID_HANDLE_VALUE)
{
   char buf = "From\0\To\0Message\0";
   uint cb = sizeof(buf);
   WriteFile(hSlot, buf, cb, &cb, NULL);
   CloseHandle(hSlot);
}


19)--------------------------------------------------------------------------

 Q> Как создать юзера и дать ему права?
 A>

NET_API_STATUS UserAdd(LPSTR username) //(c) Serge Andyk
{
// некоторые используемые функции описаны выше

USER_INFO_2   user_info;

char compname[256];
wchar_t wcompname[256];
DWORD parm_err=0;
LSA_HANDLE PolicyHandle;

LPTSTR lpszSystemInfo;    // ptr. to system info. string
DWORD cchBuff = 256;      // size of comp. or user name
TCHAR tchBuffer2[256];    // buffer for concat'd. str.
WCHAR wGroupNameAdd[20]=L"Administrators";
lpszSystemInfo = tchBuffer2;
ZeroMemory(&user_info,sizeof(user_info));

    GetComputerName(lpszSystemInfo, &cchBuff);
    strcpy(compname,"\\\\");
    strcat(compname,lpszSystemInfo);

    mbstowcs( wcompname, compname, strlen(compname)+1 );
    mbstowcs(user_info.usri2_name,username, strlen(username)+1 );

 //-------создаем юзера------------//

        user_info.usri2_password = L"";
        user_info.usri2_priv = USER_PRIV_USER;
        user_info.usri2_flags =

UF_SCRIPT|UF_PASSWD_CANT_CHANGE|UF_DONT_EXPIRE_PASSWD|UF_NORMAL_ACCOUNT;

user_info.usri2_acct_expires=TIMEQ_FOREVER;

 NetUserAdd(wcompname,// PDC name
       2L,                   // level
       (LPBYTE)&user_info,   // input buffer
       &parm_err );          // parameter in error

 GetAccountSid(
            NULL,       // default lookup logic
            username,   // account to obtain SID
            &pSid       // buffer to allocate to contain resultant SID
            );

 NetLocalGroupAddMember(0,wGroupNameAdd,pSid);

 //---------даем ему кое-какие права-----------//

OpenPolicy(
     wcompname,           // target machine
     POLICY_ALL_ACCESS,
     &PolicyHandle        // resultant policy handle
      );


SetPrivilegeOnAccount(
                    PolicyHandle,               // policy handle
                    pSid,                       // SID to grant privilege
                    L"SeInteractiveLogonRight", // Unicode privilege
                    TRUE                        // enable the privilege
                    );

SetPrivilegeOnAccount(
                    PolicyHandle,
                    pSid,
                    L"SeNetworkLogonRight",
                    TRUE
                    );


LsaClose(PolicyHandle);

return 0;
}

20)--------------------------------------------------------------------------

 Q> Как узнать какие пользователи есть на моей (или не моей) машине
 A>

#define STRICT
#include <windows.h>
#include <lm.h>
#include <iostream.h>
#include <tchar.h>

void UserEnum()
{
    BOOL keepGoing = TRUE ;
    DWORD entriesRead, totalEntries ;
    USER_INFO_2 * pInfo = NULL ;
    DWORD resumeHandle = 0 ; // must be 0 to start with
    char nameBuf[ UNLEN + 1 ] ; // constants defined in LMCONS.H
    char commentBuf[ MAXCOMMENTSZ + 1 ] ;
    WCHAR serverName[ 100 ] ;
    lstrcpyW( serverName, L"\\\\PDC" ) ; //L"" ) ;
    while ( keepGoing )
    {
        NET_API_STATUS ret = NetUserEnum(
            serverName, //NULL,
            2,
   0, //FILTER_NORMAL_ACCOUNT,
            (LPBYTE *)&pInfo, // Important:  ADDRESS of POINTER
            sizeof( USER_INFO_2 ) * 100, // requested buffer size;
            &entriesRead,
            &totalEntries,
            &resumeHandle ) ;

        keepGoing = ( ret == ERROR_MORE_DATA ) ;

        if ( ret == 0 || ret == ERROR_MORE_DATA )
        {
            DWORD i ;
            for ( i = 0 ; i < entriesRead ; i++ )
            {
                //  Note that strings in the INFO structures
                //  will ALWAYS be Unicode, regardless of
                //  your settings!  Even though they're declared
                //  as LPTSTR, they're always LPWSTR.
                //  I'm compiling for non-Unicode, so I
                //  convert them to ANSI strings...
                //  Check for NULL pointers in the INFO structure
                LPWSTR pName = (LPWSTR)pInfo[ i ].usri2_name ;
                LPWSTR pComm = (LPWSTR)pInfo[ i ].usri2_comment ;
                if ( pName == NULL )
                {
                    lstrcpy( nameBuf, "(no name!)" ) ;
                }
                else if ( lstrlenW( pName ) == 0 )
                {
                    lstrcpy( nameBuf, "(empty name!)" ) ;
                }
                else
                {
                    WideCharToMultiByte( CP_ACP, 0,
                        pName, -1,
                        nameBuf, UNLEN,
                        NULL, NULL ) ;
                }
                if ( pComm == NULL )
                {
                    lstrcpy( commentBuf, "(no comment!)" ) ;
                }
                else if ( lstrlenW( pComm ) == 0 )
                {
                    lstrcpy( commentBuf, "(empty comment!)" ) ;
                }
                else
                {
                    WideCharToMultiByte( CP_ACP, 0,
                        pComm, -1,
                        commentBuf, MAXCOMMENTSZ,
                        NULL, NULL ) ;
                }
                cout << nameBuf << ":  " << commentBuf << endl ;
            }
        }
        else
        {
            cout << "NetUserEnum error " << ret << endl ;
        }

        if ( pInfo )
        {
            NetApiBufferFree( pInfo ) ;
            pInfo = NULL ;
        }
    }
}

21)----------------------------------------------------------------------------

Q> Кто по сети или локально шарится по моей(не моей)машине?
A>

//------------------------------------------------------
// Who.exe (c) 1999 Serge Andyk asvzzz@chat.ru
// Usage "who [server]". Show all local and network users
// on specified server and some additional information.
// Freeware.You can use and modify this source code
// as you wish.
//-------------------------------------------------------

#include <windows.h>
#include <lm.h>
#include <stdio.h>
#pragma hdrstop

#pragma comment( lib, "netapi32.lib" )

#define MAXLEN 256

 SESSION_INFO_502 *buf, *cur;
 WKSTA_USER_INFO_1 *bufw, *curw;
 FILE_INFO_3 *buff,*curf;

 DWORD read, total, resumeh, rc, i;
//-----------------------------------------------------------
void PrintError( DWORD err )
{
 char msgbuf[4096];

 FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  msgbuf, sizeof( msgbuf ), NULL );
 printf( "Error %d: %s\n", err, msgbuf );
}
//-------------------------------------------------------

void PrintLocalUsers(LPWSTR server)
{
 resumeh = 0;
 do
 {
  bufw = NULL;

  rc = NetWkstaUserEnum(
   (LPTSTR)server,
   1,
   (LPBYTE*) &bufw,
   2048,
   &read,
   &total,
   &resumeh );

  if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
   break;

{
  for ( i = 0, curw = bufw; i < read; ++ i, ++ curw )
  {
   printf( "%-12S %-15S %-12S \n",
    curw->wkui1_username, curw->wkui1_logon_domain,
    curw->wkui1_logon_server
    );

  }
}
  if ( bufw != NULL )
  NetApiBufferFree( bufw );

 } while ( rc == ERROR_MORE_DATA );

 if ( rc != ERROR_SUCCESS )  PrintError( rc );
}
//-------------------------------------------------------
void PrintNetUsers(LPWSTR server)
{
 resumeh = 0;
 do
 {
  buf = NULL;

  rc = NetSessionEnum(
   (LPTSTR) server,
   NULL,
   NULL,
   502,
   (LPBYTE*)&buf,
   2048,
   &read,
   &total,
   &resumeh );

  if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
   break;
{
  for ( i = 0, cur = buf; i < read; ++ i, ++ cur )
  {
   printf( "%-12S %-12S %-27S %-22S\n",
    cur->sesi502_username, cur->sesi502_cname, cur->sesi502_transport,
    cur->sesi502_cltype_name
    );
  }
}

  if ( buf != NULL )
   NetApiBufferFree( buf );

 } while ( rc == ERROR_MORE_DATA );

 if ( rc != ERROR_SUCCESS )  PrintError( rc );
}
//-------------------------------------------------------
void PrintNetFiles(LPWSTR server)
{

 resumeh = 0;
 do
 {
  buff = NULL;

  rc=NetFileEnum(
   (char *) server,
   NULL,
   NULL,
   3,
      (BYTE**)&buff,
   2048,
   &read,
   &total,
   &resumeh );


  if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
   break;


  for ( i = 0, curf = buff; i < read; ++ i, ++ curf )
  {
   printf( "%-12S %-15S  \n",
    curf->fi3_username, curf->fi3_pathname
    );

  }
  if ( buff != NULL )
  NetApiBufferFree( buff );

 } while ( rc == ERROR_MORE_DATA );

  if ( rc != ERROR_SUCCESS ) PrintError( rc );

}
//-------------------------------------------------------
int main( int argc, char *argv[] )
{

 WCHAR server[MAXLEN];

 if ( argc == 1 )
 {
  wcscpy(server,L"");
 }
 else
 if ( argc == 2 )
 {
  mbstowcs( server, argv[1],MAXLEN);
 }
 else
        {
 printf("Usage - who [server]");
 exit(1);
 }

 printf("\nLocal users:\n");
 PrintLocalUsers(server);
 printf("\nNet users:\n");
 PrintNetUsers(server);
 printf("\nFiles(Pipes)\n");
 PrintNetFiles(server);

 return 0;
}

22)---------------------------------------------------------------------------

Q> Как в мультипроцессорной системе указать задаче на каком процессоре работать?
A>

        HANDLE threadHandle = GetCurrentThread();
        SetThreadIdealProcessor(threadHandle, 1);


23)---------------------------------------------------------------------------

 Q> Как установить (узнать) приоритет процесса?
 A>

{
        HANDLE procHandle = GetCurrentProcess();
        if (!SetPriorityClass(procHandle, HIGH_PRIORITY_CLASS))
                RET_ERR("SetPriorityClass");

        DWORD priorityClass = GetPriorityClass(procHandle);
        ADD_STR("Priority Class is set to : ");
        switch(priorityClass)
        {
        case HIGH_PRIORITY_CLASS:
                ADD_STR("HIGH_PRIORITY_CLASS\r\n");
                break;
        case IDLE_PRIORITY_CLASS:
                ADD_STR("IDLE_PRIORITY_CLASS\r\n");
                break;
        case NORMAL_PRIORITY_CLASS:
                ADD_STR("NORMAL_PRIORITY_CLASS\r\n");
                break;
        case REALTIME_PRIORITY_CLASS:
                ADD_STR("REALTIME_PRIORITY_CLASS\r\n");
                break;
        default:
                ADD_STR("Unknown priority class\r\n");
        }
        return result_buffer;
}

24)---------------------------------------------------------------------------

 Q> Как установить (узнать) приоритет нити?
 A>

{
        HANDLE threadHandle = GetCurrentThread();
        if (!SetThreadPriority(threadHandle, THREAD_PRIORITY_HIGHEST))
                RET_ERR("SetThreadPriority");

        int priority = GetThreadPriority(threadHandle);
        if (priority == THREAD_PRIORITY_ERROR_RETURN)
                RET_ERR("GetThreadPriority");
        switch (priority)
        {
        case THREAD_PRIORITY_ABOVE_NORMAL:
                ADD_STR("THREAD_PRIORITY_ABOVE_NORMAL\r\n");
                        break;
        case THREAD_PRIORITY_BELOW_NORMAL:
                ADD_STR("THREAD_PRIORITY_BELOW_NORMAL\r\n");
                        break;
        case THREAD_PRIORITY_HIGHEST:
                ADD_STR("THREAD_PRIORITY_HIGHEST\r\n");
                        break;
        case THREAD_PRIORITY_IDLE:
                ADD_STR("THREAD_PRIORITY_IDLE\r\n");
                        break;
        case THREAD_PRIORITY_LOWEST:
                ADD_STR("THREAD_PRIORITY_LOWEST\r\n");
                        break;
        case THREAD_PRIORITY_NORMAL:
                ADD_STR("THREAD_PRIORITY_NORMAL\r\n");
                        break;
        case THREAD_PRIORITY_TIME_CRITICAL:
                ADD_STR("THREAD_PRIORITY_TIME_CRITICAL\r\n");
                        break;
        default:
                ADD_STR("Unknown\r\n");
        }
        return result_buffer;}

25)---------------------------------------------------------------------------

 Q> Как определить тип NT - server или workstation?
 A> Через регистри -

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ProductOptions

Значение "Product Type". Три возможных варианта :

"WinNT"       workstation
"ServerNT"    server
"LanmanNT"    domain controller

26)--------------------------------------------------------------------------

Q> Как проследить чтобы только одна копия приложения работала в данный момент
A>

BOOL WeAreAlone (LPSTR szName)
{
   HANDLE hMutex = CreateMutex (NULL, TRUE, szName);
   if (GetLastError() == ERROR_ALREADY_EXISTS)
   {
      CloseHandle(hMutex);
      return FALSE;
   }
   return TRUE;
}

И в начале WinMain или main -

if (WeAreAlone ("Some_Unique_Name_Or_Other"))
{
   // Proceed
}
else
{
   MessageBox (NULL,"Error","Error: app already running!",MB_OK|MB_ICONERROR);
   exit(1);
}

27)---------------------------------------------------------------------------

Q> Имеется PID процесса,как узнать имя "process executable"?
A>

#include <psapi.h>
#pragma comment(lib,"psapi.lib")
//psapi.h,lib,dll есть в VC5 и VC6

   HANDLE  hProc;
   char    szProcessName [80];
   HMODULE ahMod [10];
   DWORD   dwNeeded;

   hProc = OpenProcess (PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
                        FALSE,
                        PID); // PID должен быть обьявлен как DWORD
   if (hProc)
   {
      if (EnumProcessModules (hProc,
                              ahMod,
                              sizeof(ahMod),
                              &dwNeeded))
      {
         if (GetModuleBaseName (hProc,
                                ahMod[0],
                                szProcessName,
                                sizeof(szProcessName)))
         {
            <success>
         }
         else
         {
            <failure>
         }
      }
      CloseHandle (hProc);
   }
}

28)--------------------------------------------------------------------------

Q> Как извлечь версию EXE,DLL и т.д.?
A>

void GetVersionOfFile (char * pszAppName, // file
                       char * pszVerBuff, // receives version
                       int     iVerBuffLen, // size of buffer
                       char * pszLangBuff, // receives language
                       int iLangBuffLen) // size of buffer
{
   DWORD dwScratch;
   DWORD * pdwLangChar;
   DWORD dwInfSize ;
   UINT uSize;
   BYTE * pbyInfBuff;
   char szVersion [32];
   char szResource [80];
   char * pszVersion = szVersion;

   dwInfSize = GetFileVersionInfoSize (pszAppName, &dwScratch);

   if (dwInfSize)
   {
      pbyInfBuff = new BYTE [dwInfSize];
      memset (pbyInfBuff, 0, dwInfSize);
      if (pbyInfBuff)
      {
         if (GetFileVersionInfo (pszAppName, 0, dwInfSize, pbyInfBuff))
         {
            if (VerQueryValue (pbyInfBuff,
                               "\\VarFileInfo\\Translation",
                               (void**)(&pdwLangChar),
                               &uSize))
            {
               if (VerLanguageName (LOWORD (*pdwLangChar),
                                    szResource,
                                    sizeof(szResource)))
               {
                  strncpy (pszLangBuff, szResource, iLangBuffLen);
               }
               wsprintf (szResource, "\\StringFileInfo\\%04X%04X\\FileVersion",
                         LOWORD (*pdwLangChar), HIWORD (*pdwLangChar));

               if (VerQueryValue (pbyInfBuff,
                                  szResource,
                                  (void**)(&pszVersion),
                                  &uSize))
               {
                  strncpy (pszVerBuff, pszVersion, iVerBuffLen-1);
               }
            }
         }
         delete [] pbyInfBuff;
      }
   }
}

29)---------------------------------------------------------------------------

Q> Как узнать имя дефолтового web browsera и , вообще, как узнать - с
Q> какой программой ассоциирован данный тип файла (напр .HTM или .ZIP)?

A> Создать временный .htm или .zip и использовать апишную FindExecutable

30)---------------------------------------------------------------------------

Q> Как удалить директорию,если она не пустая?
A>

SHFILEOPSTRUCT sh;

sh.hwnd   = GetSafeHwnd(); //Для BCB sh.hwnd=FormX->Handle;
sh.wFunc  = FO_DELETE;
sh.pFrom  = "c:\\test\0";
sh.pTo    = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;

SHFileOperation (&sh);

Этот код выносит все дерево, начиная с (и включая) с:\test

31)----------------------------------------------------------------------------

Q> Как запретить переключение по alt-tab?
A>

Для MSVC:

CMainFrame::CMainFrame()
{
 m_nHotKeyID = 100;

 BOOL m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(), m_nHotKeyID,
  MOD_ALT, VK_TAB);

 ASSERT(m_isKeyRegistered != FALSE);
}

//Убираем блокировку при выходе из приложения
CMainFrame::~CMainFrame()
{
 BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
 ASSERT(m_isKeyUnregistered != FALSE);
}

Для BCB:

DWORD m_nHotKeyID = 100;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 BOOL m_isKeyRegistered = RegisterHotKey(Form1->Handle, m_nHotKeyID,
  MOD_ALT, VK_TAB);
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  BOOL m_iskeyUnregistered = UnregisterHotKey(Form1->Handle, m_nHotKeyID);
}

32)----------------------------------------------------------------------------

Q> Как программно нажать клавишу (Num Lock например)?
A>

Win95/98:
    {
    BYTE KeyboardState[ 256 ];
    GetKeyboardState( KeyboardState );
    KeyboardState[ VK_NUMLOCK ] = KeyboardState[ VK_NUMLOCK ] ^ 1;
    SetKeyboardState( KeyboardState );
    }

WinNT:
    {
    keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
    keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0
);
    }

33)--------------------------------------------------------------------------

Q> Как соединиться по RAS ?
A>

#include <ras.h>
#include <raserror.h>

bool DialUp(LPTSTR PhoneNumber,LPTSTR UserName,LPTSTR Password)
{
    RASDIALPARAMS rdParams;
    rdParams.dwSize = sizeof(RASDIALPARAMS);
 rdParams.szEntryName[0] = '\0';
 lstrcpy( rdParams.szPhoneNumber, PhoneNumber );
 rdParams.szCallbackNumber[0] = '\0';
 lstrcpy( rdParams.szUserName, UserName );
 lstrcpy( rdParams.szPassword, Password );
 rdParams.szDomain[0] = '\0';

 HRASCONN hRasConn = NULL;
    DWORD dwRet = RasDial( NULL, NULL, &rdParams, 0L, NULL, &hRasConn );
    if ( dwRet == 0 )  return true;
    char  szBuf[256];
 if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
  wsprintf( (LPSTR)szBuf, "Undefined RAS Dial Error (%ld).", dwRet );
 RasHangUp( hRasConn );
 MessageBox( (LPSTR)szBuf, "Error", MB_OK | MB_ICONSTOP );
 return false;
}

34)----------------------------------------------------------------------------

Q> Как определить,имеется ли соединение по RAS?
A>

BOOL IsInternetConnected ()
{
            DWORD nRasDevices = 20;
            DWORD nSize = 20;

            RASCONN rasconnected [10];  // Ras Connected struct

            rasconnected[0].dwSize = sizeof(RASCONN);
            RasEnumConnections( rasconnected, &nSize, &nRasDevices );

           return ( BOOL (nRasDevices) );
}
Note:95 считает что соединение произошло,как только модем подымает трубу ;-)

35)--------------------------------------------------------------------------

Q> Как разорвать соединение?
A>

bool  HangUp()
{
 RASCONN ras[20];
 DWORD  dSize, dNumber;
 char  szBuf[256];

 ras[0].dwSize = sizeof( RASCONN );
 dSize = sizeof( ras );   // Get active RAS - Connection
 DWORD  dwRet = RasEnumConnections( ras, &dSize, &dNumber );
 if ( dwRet != 0 )
 {
  if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
   wsprintf( (LPSTR)szBuf, "Undefined RAS Enum Connections error (%ld).", dwRet
);
  MessageBox( (LPSTR)szBuf, "RasHangUp", MB_OK | MB_ICONSTOP );
  return false;
 }
 bool bOK = true;
 for( DWORD dCount = 0;  dCount < dNumber;  dCount++ )
 {    // Hang up that connection
  HRASCONN hRasConn = ras[dCount].hrasconn;
  DWORD dwRet = RasHangUp( hRasConn );
  if ( dwRet != 0 )
  {
   char  szBuf[256];
   if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
    wsprintf( (LPSTR)szBuf, "Undefined RAS HangUp Error (%ld).", dwRet );
   MessageBox( (LPSTR)szBuf, "RasHangUp", MB_OK | MB_ICONSTOP );
   bOK = false;
  }
 }
 return bOK;
}

36)---------------------------------------------------------------------------

Q>Как узнать максимум информации о типе и возможностях ОС на удаленной машине
A>

 NetServerGetInfo(LPTSTR servername,DWORD level,LPBYTE *bufptr);

   Откликаются все операционки производства MS и UNIXы с установленной самбой.
   Выдают о себе все что сами знают ;-)

37)----------------------------------------------------------------------------

Q> Как создать hard link на NTFS?
A>

#include <windows.h>
#include <stdio.h>
#pragma hdrstop
#define err doerr( __FILE__, __LINE__ )

void doerr( const char *file, int line )
{
 DWORD e;

 e = GetLastError();
 if ( e == 0 )
  return;

 printf( "%s(%d): gle = %lu\n", file, line, e );
 exit( 2 );
}

void enableprivs()
{
 HANDLE hToken;
 byte buf[sizeof TOKEN_PRIVILEGES * 2];
 TOKEN_PRIVILEGES & tkp = *( (TOKEN_PRIVILEGES *) buf );

 if ( ! OpenProcessToken( GetCurrentProcess(),
  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
  err;

 // берем SeBackupPrivilege и SeRestorePrivilege

 if ( !LookupPrivilegeValue( NULL, SE_BACKUP_NAME, &tkp.Privileges[0].Luid ) )
  err;

 if ( !LookupPrivilegeValue( NULL, SE_RESTORE_NAME, &tkp.Privileges[1].Luid ) )
  err;

 tkp.PrivilegeCount = 2;
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 tkp.Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;

 AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp,
  NULL, NULL );
}

int main( int argc, char *argv[] )
{
 HANDLE fh;

 if ( argc != 3 )
 {
 printf( "usage: lnw {file} {new_link_name}\n" );
 return 1;
 }
 enableprivs();

 fh = CreateFile( argv[1], GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
  FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS, NULL );
 if ( fh == INVALID_HANDLE_VALUE || fh == NULL ) err;

 static char buf1[MAX_PATH];
 static wchar_t buf2[MAX_PATH * 2];
 char *p;
 void *ctx = NULL;
 WIN32_STREAM_ID wsi;
 DWORD numwritten;

 GetFullPathName( argv[2], MAX_PATH, &buf1[0], &p );

 wsi.dwStreamId = BACKUP_LINK;
 wsi.dwStreamAttributes = 0;
 wsi.dwStreamNameSize = 0;
 wsi.Size.QuadPart = strlen( buf1 ) * 2 + 2;
 MultiByteToWideChar( CP_ACP, 0, buf1, strlen( buf1 ) + 1, buf2, MAX_PATH );

 if ( ! BackupWrite( fh, (byte *) &wsi, 20, &numwritten, FALSE, FALSE, &ctx )
)err;
 if ( numwritten != 20 ) err;

 if ( ! BackupWrite( fh, (byte *) buf2, wsi.Size.LowPart, &numwritten, FALSE,
FALSE, &ctx ) )err;
 if ( numwritten != wsi.Size.LowPart )err;

 BackupWrite( fh, (byte *) &buf1[0], 0, &numwritten, TRUE, FALSE, &ctx );
 CloseHandle( fh );
 return 0;
}

38)----------------------------------------------------------------------------

Q> Как "зашедулить" задачу ?
A>

#include <windows.h>
#include <lm.h>
#include <stdio.h>
#include <stdlib.h>
#pragma hdrstop

#define BREAK_ME 1 /// #undef to get working code
#undef BREAK_ME
#pragma pack( push )

#ifdef BREAK_ME
 #pragma pack( 2 )
#else
 #pragma pack( 4 )
#endif

#include <lmat.h>
#pragma pack( pop )
#define lenof(x) ( sizeof (x) / sizeof (x)[0] )

int main( int argc, char *argv[] )
{
 wchar_t server[256], cmd[1024];
 AT_INFO at;
 DWORD rc, id;
 if ( argc < 2 || argc > 3 )
 {
  puts( "usage: nsja [\\\\server] \"command\"" );
  return 1;
 }
 if ( argc > 2 )
  mbstowcs( server, argv[2], lenof( server ) );
 else
  server[0] = L'\0';
 mbstowcs( cmd, argv[argc - 1], lenof( cmd ) );

 memset( &at, '\0', sizeof at );
 at.Command = &cmd[0];

 rc = NetScheduleJobAdd( server, (byte *) &at, &id );

 if ( rc != ERROR_SUCCESS )
  printf( "NSJA() returned %lu\n", rc );

 return 0;
}
39)----------------------------------------------------------------------------

Q> Как посмотреть,что же там уже "нашедулено"?
A>

#include <windows.h>
#include <lm.h>
#include <stdio.h>
#include <stdlib.h>
#pragma hdrstop

#define BREAK_ME 1 /// #undef to get working code
#undef BREAK_ME

#pragma pack( push )

#ifdef BREAK_ME
 #pragma pack( 2 )
#else
 #pragma pack( 4 )
#endif

#include <lmat.h>
#pragma pack( pop )
#define lenof(x) ( sizeof (x) / sizeof (x)[0] )

int main( int argc, char *argv[] )
{
 wchar_t server[256];
 AT_ENUM *pBuf, *pJob;
 DWORD i, rc, nRead, nLeftBeforeCall, hResume;
 bool goForIt;
 if ( argc > 2 )
 {
  puts( "usage: nsje [\\\\server]" );
  return 1;
 }
 if ( argc > 2 )
  mbstowcs( server, argv[2], lenof( server ) );
 else
  server[0] = L'\0';

 hResume = 0;
 printf( "%8.8s %.70s\n", "JobId", "Command" );
 printf( "%8.8s %.70s\n", "--------",
"----------------------------------------------------------------------" );
 goForIt = true;
 while ( goForIt )
 {
  pBuf = NULL;
  rc = NetScheduleJobEnum( *server == L'\0'? NULL: server, (BYTE **) &pBuf,
   8192, &nRead, &nLeftBeforeCall, &hResume );

  if ( rc != ERROR_SUCCESS && rc != ERROR_MORE_DATA )
  {
   printf( "Doh! rc = %lu\n", rc );
   return 1;
  }
  for ( pJob = pBuf, i = 0; i < nRead; ++ i, ++ pJob )
  {
   printf( "%8lu %.70S\n", pJob->JobId, pJob->Command );
  }

  if ( pBuf != NULL )
   NetApiBufferFree( pBuf );

  if ( rc == ERROR_SUCCESS )
   goForIt = false;
 }
 return 0;
}
40)----------------------------------------------------------------------------

Q> Можно ли в 95 использовать функции Net*() (NetFileEnum и т.п.)?
A> Можно.

Вариант 1: Делаем по порядку -

 п.1 - Покупаем качественный бубен.
 п.2 - Периодически постукивая бубном и обходя нижеприведенные
       грабли пишем прогу.

В Win95 вы должны включать файл svrapi.h,а не lm.h как в NT.
Также нужно использовать svrapi.lib и svrapi.dll,а не netapi32.lib и
netapi32.dll.Если хочется поддерживать обе платформы - прийдется dll
грузить динамически.
Внимание: в 95 Net*() функции имеют другую семантику по сравнению с NT.
Строки должны быть в ANSI,не все уровни доступны.Возвращаемые структуры
различны.Управление памятью различно.
Для NT требуется адрес указателя на буфер,95-му надо указатель на буфер.

    // Windows NT
    BYTE *buf;
    DWORD prefmaxlen;
    // ...
    buf = NULL;
    prefmaxlen = 8192; // or whatever
    result = NetSomeFunction( ..., &buf, prefmaxlen, ... );
    // process buffer ...
    NetApiBufferFree( buf );

    // Windows 9X
    BYTE *buf;
    WORD cbBuffer;
    // ...
    cbBuffer = 8192; // or whatever
    buf = (BYTE *) malloc( cbBuffer );
    result = NetSomeFunction( ..., buf, cbBuffer ... );
    // process buffer ...
    free( buf );

Крайне рекомендуется посмотреть svrapi.h файл.

PS: Если ничего не получается - то или эта функция вообще отсутствует
    в srvapi.h и dll(неплохо бы сначала посмотреть), или мало трясли бубном.
PPS: Говорят еще хорошо помогает дудочка из малой берцовой кости
     девственницы - духов хорошо ублажает ;-)

Вариант 2:

From: "Michael L. Stepuchev" <stepuchev@prognoz.ru>

Для Windows 95 есть что-то типа Administration Kit (лежит в WinNT Resource
Kit). Вот там есть 2 dll-ины (radmin32.dll & rlocal32.dll), в
которых описаны все или почти все функции NT-евой netapi32.dll. Надо
юзать эти dll-ины.

41)----------------------------------------------------------------------------

Q> Как определить частоту процессора?
A>

WinNT:

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\~Mhz

42)---------------------------------------------------------------------------

Q> Как узнать MAC адрес сетевой карты?

Секция 2 из 3 - Предыдущая - Следующая

Вернуться в раздел "Программирование в Windows" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru