?? listnet.c
字號:
//======================================================================
// ListNet - A network demo application for Windows CE
//
// Written for the book Programming Windows CE
// Copyright (C) 1998 Douglas Boling
//======================================================================
#include <windows.h> // For all that Windows stuff
#include <winnetwk.h> // Network includes
#include "ListNet.h" // Program-specific stuff
//----------------------------------------------------------------------
// Global data
//
const TCHAR szAppName[] = TEXT ("ListNet");
HINSTANCE hInst; // Program instance handle
BOOL fFirst = TRUE;
// Command Message dispatch for MainWindowProc
const struct decodeCMD MainCommandItems[] = {
IDOK, DoMainCommandExit,
IDCANCEL, DoMainCommandExit,
IDD_NETLIST, DoMainCommandViewDrive,
IDD_CNCT, DoMainCommandMapDrive,
IDD_DCNCT, DoMainCommandFreeDrive,
};
//======================================================================
//
// Program entry point
//
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPWSTR lpCmdLine, int nCmdShow) {
// Save program instance handle in global variable.
hInst = hInstance;
// Create main window.
DialogBox (hInst, szAppName, NULL, MainWndProc);
return 0;
}
//======================================================================
// Message handling procedures for main window
//----------------------------------------------------------------------
// MainWndProc - Callback function for application window
//
BOOL CALLBACK MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
INT i;
// With only two messages, do it the old-fashioned way.
switch (wMsg) {
case WM_INITDIALOG:
i = 75;
SendDlgItemMessage (hWnd, IDD_NETLIST, LB_SETTABSTOPS, 1,
(LPARAM)&i);
RefreshLocalNetDrives (hWnd);
break;
case WM_COMMAND:
return DoCommandMain (hWnd, wMsg, wParam, lParam);
}
return FALSE;
}
//----------------------------------------------------------------------
// DoCommandMain - Process WM_COMMAND message for window.
//
BOOL DoCommandMain (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam){
WORD idItem, wNotifyCode;
HWND hwndCtl;
INT i;
// Parse the parameters.
idItem = (WORD) LOWORD (wParam);
wNotifyCode = (WORD) HIWORD (wParam);
hwndCtl = (HWND) lParam;
// Call routine to handle control message.
for (i = 0; i < dim(MainCommandItems); i++) {
if (idItem == MainCommandItems[i].Code) {
(*MainCommandItems[i].Fxn)(hWnd, idItem, hwndCtl,
wNotifyCode);
return TRUE;
}
}
return FALSE;
}
//======================================================================
// Command handler routines
//----------------------------------------------------------------------
// DoMainCommandExit - Process Program Exit command
//
LPARAM DoMainCommandExit (HWND hWnd, WORD idItem, HWND hwndCtl,
WORD wNotifyCode) {
EndDialog (hWnd, 0);
return 0;
}
//----------------------------------------------------------------------
// DoMainCommandViewDrive - Process list box double clicks
//
LPARAM DoMainCommandViewDrive (HWND hWnd, WORD idItem, HWND hwndCtl,
WORD wNotifyCode) {
TCHAR szCmdLine[128], szFolder[MAX_PATH];
PROCESS_INFORMATION pi;
HCURSOR hOld;
INT i, rc;
// We're only interested in list box double-clicks.
if (wNotifyCode != LBN_DBLCLK)
return 0;
i = SendMessage (hwndCtl, LB_GETCURSEL, 0, 0);
if (i == LB_ERR) return 0;
i = SendMessage (hwndCtl, LB_GETTEXT, i, (LPARAM)szFolder);
hOld = SetCursor (LoadCursor (NULL, IDC_WAIT));
lstrcpy (szCmdLine, TEXT ("\\network\\"));
lstrcat (szCmdLine, szFolder);
rc = CreateProcess (TEXT ("Explorer"), szCmdLine, NULL, NULL,
FALSE, 0, NULL, NULL, NULL, &pi);
if (rc) {
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
}
SetCursor (hOld);
return TRUE;
}
//----------------------------------------------------------------------
// DoMainCommandMapDrive - Process map network drive command.
//
LPARAM DoMainCommandMapDrive (HWND hWnd, WORD idItem, HWND hwndCtl,
WORD wNotifyCode) {
DWORD rc;
CONNECTDLGSTRUCT cds;
NETRESOURCE nr;
TCHAR szRmt[256];
memset (&nr, 0, sizeof (nr));
nr.dwType = RESOURCETYPE_DISK;
memset (szRmt, 0, sizeof (szRmt));
cds.cbStructure = sizeof (cds);
cds.hwndOwner = hWnd;
cds.lpConnRes = &nr;
cds.dwFlags = CONNDLG_PERSIST;
// Display dialog box.
rc = WNetConnectionDialog1 (&cds);
if (rc == NO_ERROR)
RefreshLocalNetDrives (hWnd);
return 0;
}
//----------------------------------------------------------------------
// DoMainCommandFreeDrive - Process disconnect network drive command.
//
LPARAM DoMainCommandFreeDrive (HWND hWnd, WORD idItem, HWND hwndCtl,
WORD wNotifyCode) {
WNetDisconnectDialog (hWnd, RESOURCETYPE_DISK);
RefreshLocalNetDrives (hWnd);
return 0;
}
//======================================================================
// Network browsing functions
//----------------------------------------------------------------------
// EnumerateLocalNetDrives - Add an item to the list view control.
//
INT RefreshLocalNetDrives (HWND hWnd) {
HWND hwndCtl = GetDlgItem (hWnd, IDD_NETLIST);
INT rc, nBuffSize = 1024;
DWORD dwCnt, dwSize;
HANDLE hEnum;
LPNETRESOURCE pnr;
NETRESOURCE nr;
PBYTE pPtr, pNew;
TCHAR szText[256];
SendMessage (hwndCtl, LB_RESETCONTENT, 0, 0);
// Allocate buffer for enumeration data.
pPtr = (PBYTE) LocalAlloc (LPTR, nBuffSize);
if (!pPtr)
return -1;
// Initialize specification for search root.
memset (&nr, 0, sizeof (nr));
lstrcpy (szText, TEXT ("\\sjdev"));
nr.lpRemoteName = szText;
nr.dwUsage = RESOURCEUSAGE_CONTAINER;
// Start enumeration.
rc = WNetOpenEnum (RESOURCE_REMEMBERED, RESOURCETYPE_ANY, 0, 0,
&hEnum);
if (rc != NO_ERROR) return -1;
// Enumerate one item per loop.
do {
dwCnt = 1;
dwSize = nBuffSize;
rc = WNetEnumResource (hEnum, &dwCnt, pPtr, &dwSize);
pnr = (NETRESOURCE *)pPtr;
lstrcpy (szText, pnr->lpLocalName);
// Process returned data.
if (rc == NO_ERROR) {
switch (pnr->dwType) {
case RESOURCETYPE_ANY:
lstrcat (szText, TEXT ("\t Share"));
break;
case RESOURCETYPE_PRINT:
lstrcat (szText, TEXT ("\t Printer"));
break;
case RESOURCETYPE_DISK:
lstrcat (szText, TEXT ("\t Disk"));
break;
}
SendMessage (hwndCtl, LB_ADDSTRING, 0, (LPARAM)szText);
// If our buffer was too small, try again.
} else if (rc == ERROR_MORE_DATA) {
pNew = LocalReAlloc (pPtr, dwSize, LMEM_MOVEABLE);
if (pNew) {
pPtr = pNew;
nBuffSize = LocalSize (pPtr);
rc = 0;
} else
break;
}
} while (rc == 0);
// Clean up.
WNetCloseEnum (hEnum);
LocalFree (pPtr);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -