윈도우 리모트 네트워크 소스인데 ㅡ.ㅡ;; 여기서 창조에 쓸만한거 없을까요?
MS 공식 소스인데...
/******************************************************************************
Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved.
remnet.c : Remote networking
******************************************************************************/
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include "string.h"
#include "memory.h"
#include "commctrl.h"
#include "wcommctl.h"
//#include "shlobj.h"
//#include "wceshell.h"
//#include "aygshell.h"
#ifdef USE_SIP
# include <sipapi.h>
#endif
#include "resource.h"
#include "remnet.h"
#ifdef DEBUG
DBGPARAM dpCurSettings = {
TEXT("RemoteNet"), {
TEXT("Unused"),TEXT("Unused"),TEXT("Unused"),TEXT("Unused"),
TEXT("Unused"),TEXT("Unused"),TEXT("Unused"),TEXT("Unused"),
TEXT("Unused"),TEXT("Unused"),TEXT("Unused"),TEXT("Misc"),
TEXT("Alloc"),TEXT("Function"),TEXT("Warning"),TEXT("Error") },
0x0000C000
//0xFFFF
};
#endif // DEBUG
ITEMINFO EditItem;
HINSTANCE v_hInst;
HWND v_hMainWnd;
HWND v_hListWnd;
HWND v_hCmdBar;
HWND v_hDialogWnd;
HFONT v_hfont;
RECT v_ClientRect;
RECT v_ListRect;
DWORD v_WizDialog;
DWORD v_PrevWizDialog;
BOOL v_fInRename;
BOOL v_fPortrait;
#ifdef USE_SIP
LPFNSIP g_pSipGetInfo, g_pSipSetInfo;
LPFNSIPSTATUS g_pSipStatus;
HINSTANCE g_hSipLib;
#endif
extern DWORD v_EnteredAsAWizard;
DWORD v_DialogPages[DLG_NUMDLGS] = {
IDD_RAS_WIZ_1,
IDD_RAS_WIZ_2,
IDD_RAS_WIZ_3,
IDD_RAS_WIZ_4,
IDD_RAS_WIZ_5,
IDD_RAS_TCPIP_GEN,
IDD_RAS_TCPIP_NAME_SERV
};
const TCHAR szAppName[] = TEXT("RemoteNet");
TCHAR szTitle[36];
const static TBBUTTON tbButton[] = {
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, -1},
{STD_DELETE+12,ID_FILE_DELETE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1},
{STD_PROPERTIES+12,ID_FILE_PROPERTIES,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, -1},
{VIEW_LARGEICONS, ID_VIEW_LARGEICON,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,-1},
{VIEW_SMALLICONS, ID_VIEW_SMALLICON,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,-1},
{VIEW_DETAILS, ID_VIEW_DETAILS, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0, 0, -1},
};
static TBBUTTON tbButtonPortrait[] = {
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, -1},
{0,ID_CONN_CONN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1},
{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, 0, -1},
// {0, ID_CONN_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1},
{STD_PROPERTIES+12,ID_CONN_EDIT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1},
{STD_DELETE+12,ID_CONN_DELETE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,-1},
};
TCHAR nonStr[10];
TCHAR deleteStr[30];
TCHAR propertiesStr[30];
TCHAR largeIconStr[30];
TCHAR smallIconStr[30];
TCHAR detailsStr[30];
const LPTSTR ToolTipsTbl[] = {
nonStr,
deleteStr,
propertiesStr,
largeIconStr,
smallIconStr,
detailsStr
};
const LPTSTR ToolTipsTblPortrait[] = {
nonStr,
largeIconStr,
smallIconStr,
propertiesStr,
deleteStr,
};
// Declare the CommCtrl stuff.
DECLARE_COMMCTRL_TABLE;
void FAR PASCAL RegisterIPClass(HINSTANCE);
void FAR PASCAL UnregisterIPClass(HINSTANCE);
void PositionSIP(int nSipState)
{
#ifdef USE_SIP
// Do we have the sip function?
if (g_pSipGetInfo && g_pSipSetInfo)
{
SIPINFO si;
// See whether the SIP is up or down
memset(&si, 0, sizeof(SIPINFO));
si.cbSize = sizeof(SIPINFO);
if ((*g_pSipGetInfo)(&si))
{
// Has the SIP state changed?
if ((!(si.fdwFlags & SIPF_ON) && SIP_UP == nSipState) ||
(si.fdwFlags & SIPF_ON && !(SIP_UP == nSipState)))
{
si.fdwFlags ^= SIPF_ON;
(*g_pSipSetInfo)(&si);
}
}
}
#endif
}
BOOL
CreateShortcut(TCHAR *pEntryName)
{
TCHAR szFmtStr[256];
TCHAR szPath[256];
TCHAR szFile[256];
char szAnsiTarget[128];
HANDLE hFile;
int nLinks = 1;
int Len;
LoadString(v_hInst, IDS_DESKTOP_PATH, szFmtStr,
sizeof(szFmtStr)/sizeof(TCHAR));
wsprintf(szPath, szFmtStr, pEntryName);
hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, NULL);
while (hFile == INVALID_HANDLE_VALUE)
{
if (nLinks++ > 20)
return FALSE;
LoadString(v_hInst, IDS_DESKTOP_PATH2, szFmtStr,
sizeof(szFmtStr)/sizeof(TCHAR));
wsprintf(szPath, szFmtStr,
pEntryName, nLinks);
hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, NULL);
}
LoadString(v_hInst, IDS_SHORTCUT_STRING, szFmtStr,
sizeof(szFmtStr)/sizeof(TCHAR));
wsprintf(szFile, szFmtStr, pEntryName);
Len = _tcslen(szFile);
wsprintf(szPath, TEXT("%d#%s"), Len, szFile);
Len = WideCharToMultiByte(CP_ACP, 0, szPath, -1, szAnsiTarget, 128, NULL, NULL);
WriteFile(hFile, szAnsiTarget, Len, &Len, NULL);
CloseHandle(hFile);
return TRUE;
}
VOID
UpdateView (DWORD What)
{
HMENU hMenu;
hMenu = CallCommCtrlFunc(CommandBar_GetMenu)(v_hCmdBar, 0);
if (ID_VIEW_LARGEICON == What)
CheckMenuRadioItem(hMenu, ID_VIEW_LARGEICON,
ID_VIEW_DETAILS,
ID_VIEW_LARGEICON,
MF_BYCOMMAND);
if (ID_VIEW_SMALLICON == What)
CheckMenuRadioItem(hMenu, ID_VIEW_LARGEICON,
ID_VIEW_DETAILS,
ID_VIEW_SMALLICON,
MF_BYCOMMAND);
if (ID_VIEW_DETAILS == What)
CheckMenuRadioItem(hMenu, ID_VIEW_LARGEICON,
ID_VIEW_DETAILS,
ID_VIEW_DETAILS,
MF_BYCOMMAND);
SendMessage (v_hCmdBar, TB_CHECKBUTTON, ID_VIEW_LARGEICON,
MAKELONG((ID_VIEW_LARGEICON == What) ? TRUE : FALSE, 0));
SendMessage (v_hCmdBar, TB_CHECKBUTTON, ID_VIEW_SMALLICON,
MAKELONG((ID_VIEW_SMALLICON == What) ? TRUE : FALSE, 0));
SendMessage (v_hCmdBar, TB_CHECKBUTTON, ID_VIEW_DETAILS,
MAKELONG((ID_VIEW_DETAILS == What) ? TRUE : FALSE, 0));
}
VOID
SetMenu()
{
HMENU hMenu;
DWORD cb;
LV_ITEM lvi;
MENUITEMINFO MenuItemInfo;
TCHAR szTemp[128];
cb = ListView_GetSelectedCount (v_hListWnd);
lvi.iItem = ListView_GetNextItem(v_hListWnd, -1, LVNI_SELECTED);
hMenu = CallCommCtrlFunc(CommandBar_GetMenu)(v_hCmdBar, 0);
// Set the File->Connect/Create menu to connect
MenuItemInfo.cbSize = sizeof(MENUITEMINFO);
MenuItemInfo.fMask = MIIM_TYPE;
MenuItemInfo.dwTypeData = szTemp;
MenuItemInfo.cch = sizeof(szTemp)/sizeof(TCHAR);
GetMenuItemInfo(hMenu, ID_FILE_CONNECTCREATE, FALSE,
&MenuItemInfo);
MenuItemInfo.fMask = MIIM_TYPE;
MenuItemInfo.cch = LoadString(v_hInst, IDS_CONNECT,
MenuItemInfo.dwTypeData,
sizeof(szTemp)/sizeof(TCHAR));
SetMenuItemInfo(hMenu, ID_FILE_CONNECTCREATE, FALSE,
&MenuItemInfo);
EnableMenuItem (hMenu, ID_FILE_CONNECTCREATE, MF_GRAYED);
EnableMenuItem (hMenu, ID_FILE_CREATESHORTCUT, MF_GRAYED);
EnableMenuItem (hMenu, ID_FILE_DELETE, MF_GRAYED);
EnableMenuItem (hMenu, ID_FILE_RENAME, MF_GRAYED);
EnableMenuItem (hMenu, ID_FILE_PROPERTIES, MF_GRAYED);
EnableMenuItem (hMenu, ID_EDIT_CREATECOPY, MF_GRAYED);
// Portrait mode menu
EnableMenuItem (hMenu, ID_CONN_CONN, MF_GRAYED);
EnableMenuItem (hMenu, ID_CONN_EDIT, MF_GRAYED);
EnableMenuItem (hMenu, ID_CONN_DELETE, MF_GRAYED);
EnableMenuItem (hMenu, ID_CONN_RENAME, MF_GRAYED);
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_EDIT,
MAKELONG(FALSE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_CONN,
MAKELONG(FALSE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_DELETE,
MAKELONG(FALSE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_FILE_DELETE,
MAKELONG(FALSE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_FILE_PROPERTIES,
MAKELONG(FALSE, 0));
if (cb == 1) {
if (lvi.iItem == 0) {
// Make new connection
// Set File->Connect/Create menu to create and enable
MenuItemInfo.fMask = MIIM_TYPE;
MenuItemInfo.cch = LoadString(v_hInst, IDS_CREATE,
MenuItemInfo.dwTypeData,
sizeof(szTemp)/sizeof(TCHAR));
SetMenuItemInfo(hMenu, ID_FILE_CONNECTCREATE, FALSE,
&MenuItemInfo);
EnableMenuItem (hMenu, ID_FILE_CONNECTCREATE,
MF_ENABLED);
} else {
EnableMenuItem (hMenu, ID_FILE_CONNECTCREATE,
MF_ENABLED);
EnableMenuItem (hMenu, ID_FILE_CREATESHORTCUT,
MF_ENABLED);
EnableMenuItem (hMenu, ID_FILE_DELETE,
MF_ENABLED);
EnableMenuItem (hMenu, ID_FILE_RENAME,
MF_ENABLED);
EnableMenuItem (hMenu, ID_FILE_PROPERTIES,
MF_ENABLED);
EnableMenuItem (hMenu, ID_EDIT_CREATECOPY,
MF_ENABLED);
EnableMenuItem (hMenu, ID_CONN_CONN, MF_ENABLED);
EnableMenuItem (hMenu, ID_CONN_EDIT, MF_ENABLED);
EnableMenuItem (hMenu, ID_CONN_DELETE, MF_ENABLED);
EnableMenuItem (hMenu, ID_CONN_RENAME, MF_ENABLED);
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_EDIT,
MAKELONG(TRUE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_CONN,
MAKELONG(TRUE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_DELETE,
MAKELONG(TRUE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_FILE_DELETE,
MAKELONG(TRUE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON,
ID_FILE_PROPERTIES,
MAKELONG(TRUE, 0));
}
} else {
if (cb != 0) {
// allow shortcuts for multiple items
if (lvi.iItem > 0) {
EnableMenuItem (hMenu, ID_EDIT_CREATECOPY,
MF_ENABLED);
}
EnableMenuItem (hMenu, ID_FILE_CONNECTCREATE,
MF_ENABLED);
EnableMenuItem (hMenu, ID_FILE_CREATESHORTCUT,
MF_ENABLED);
EnableMenuItem (hMenu, ID_FILE_DELETE,
MF_ENABLED);
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_CONN,
MAKELONG(TRUE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_CONN_DELETE,
MAKELONG(TRUE, 0));
SendMessage (v_hCmdBar, TB_ENABLEBUTTON, ID_FILE_DELETE,
MAKELONG(TRUE, 0));
EnableMenuItem (hMenu, ID_CONN_DELETE, MF_ENABLED);
}
}
}
// ----------------------------------------------------------------
//
// NotifyHandler ()
//
// Handle Notification events for the ListView
//
// ----------------------------------------------------------------
LRESULT
NotifyHandler (HWND hWnd, NM_LISTVIEW *pnm, LV_DISPINFO *plvdi)
{
LV_ITEM lvi;
PITEMINFO pItemInfo;
HWND hwndEdit;
DWORD dwTemp;
int nformatId;
TCHAR szTemp[128];
TCHAR szFmtStr[128];
DEBUGMSG (ZONE_MISC, (TEXT("Got WM_NOTIFY hdr.code=%d\r\n"),
pnm->hdr.code));
switch (pnm->hdr.code) {
case LVN_DELETEALLITEMS :
DEBUGMSG (ZONE_MISC, (TEXT("Got LVN_DELETEALLITEMS\r\n")));
return FALSE;
case LVN_DELETEITEM :
if (0 != pnm->iItem) {
DEBUGMSG (ZONE_MISC, (TEXT("Got LVN_DELETEITEM %d\r\n"), pnm->iItem));
LocalFree ((HLOCAL)pnm->lParam);
}
break;
case LVN_GETDISPINFO :
DEBUGMSG (ZONE_MISC, (TEXT("LVN_GETDISPINFO\r\n")));
if (!(plvdi->item.mask & LVIF_TEXT)) {
DEBUGMSG (ZONE_MISC, (TEXT("LVN_GETDISPINFO: Not Text? Mask=0x%X\r\n"),
plvdi->item.mask));
break;
}
SetMenu();
if (0 == plvdi->item.iItem) {
if (0 == plvdi->item.iSubItem) {
LoadString(v_hInst, IDS_MAKE_NEW,
plvdi->item.pszText,
plvdi->item.cchTextMax);
}
break;
}
pItemInfo = (PITEMINFO)plvdi->item.lParam;
switch (plvdi->item.iSubItem) {
case 0 :
_tcsncpy (plvdi->item.pszText,
pItemInfo->EntryName,
plvdi->item.cchTextMax);
break;
case 1 :
_tcsncpy (plvdi->item.pszText,
pItemInfo->szPhone,
plvdi->item.cchTextMax);
break;
case 2 :
_tcsncpy (plvdi->item.pszText,
((PITEMINFO)plvdi->item.lParam)->Entry.szDeviceName,
plvdi->item.cchTextMax);
break;
}
DEBUGMSG (ZONE_MISC, (TEXT("LVN_GETDISPINFO: Returning string '%s'\r\n"),
plvdi->item.pszText));
break;
case LVN_COLUMNCLICK:
break;
case LVN_BEGINLABELEDIT:
DEBUGMSG (ZONE_MISC, (TEXT("BeginEdit\r\n")));
if (plvdi->item.iItem == 0) {
DEBUGMSG (ZONE_MISC, (TEXT("Can't edit the 'Make New' icon\r\n")));
return TRUE; // Can't edit the Make New icon
}
v_fInRename = TRUE;
PositionSIP(SIP_UP);
ListView_EnsureVisible(v_hListWnd, plvdi->item.iItem, FALSE);
if (hwndEdit = ListView_GetEditControl(v_hListWnd)) {
SendMessage(hwndEdit, EM_LIMITTEXT,
RAS_MaxEntryName, 0);
}
return FALSE; // Return FALSE to let the user edit
case LVN_ENDLABELEDIT:
v_fInRename = FALSE;
PositionSIP(SIP_DOWN);
if (plvdi->item.pszText == NULL) {
DEBUGMSG (ZONE_MISC|ZONE_ERROR,
(TEXT("ENDLABELEIDT: Text is NULL\r\n")));
break;
}
// if it's the same as before then it's a no-op.
if (!_tcsicmp (plvdi->item.pszText, ((PITEMINFO)plvdi->item.lParam)->EntryName)) {
}
if (dwTemp = RasValidateEntryName(NULL, plvdi->item.pszText)) {
if (dwTemp == ERROR_ALREADY_EXISTS) {
nformatId = IDS_ALREADY_EXISTS;
} else if (*(plvdi->item.pszText)) {
nformatId = IDS_BADNAME;
} else {
nformatId = IDS_NULLNAME;
}
LoadString(v_hInst, nformatId, szFmtStr, sizeof(szFmtStr)/sizeof(TCHAR));
LoadString(v_hInst, (v_fPortrait) ? IDS_CONNECTIONS : IDS_REMNET,
szTemp, sizeof(szTemp)/sizeof(TCHAR));
MessageBox (hWnd, szFmtStr, szTemp, MB_OK | MB_ICONWARNING);
PostMessage (v_hListWnd, LVM_EDITLABEL,
(WPARAM)(int)plvdi->item.iItem, 0);
break;
}
RasRenameEntry(NULL, ((PITEMINFO)plvdi->item.lParam)->EntryName,
plvdi->item.pszText);
dwTemp = plvdi->item.iItem;
InitListViewItems(v_hListWnd);
ListView_SetItemState (v_hListWnd, 0, 0, LVIS_SELECTED);
ListView_SetItemState (v_hListWnd, dwTemp,
LVIS_SELECTED | LVIS_FOCUSED,
LVIS_SELECTED | LVIS_FOCUSED);
SetFocus (v_hListWnd);
break;
case NM_RCLICK:
PostMessage(v_hMainWnd, WM_COMMAND, ID_SHORTCUT, 0);
break;
case NM_CLICK:
if (GetKeyState(VK_MENU) < 0) {
PostMessage(v_hMainWnd, WM_COMMAND, ID_SHORTCUT, 0);
}
break;
case NM_DBLCLK:
if (GetKeyState(VK_MENU) < 0) {
PostMessage(v_hMainWnd, WM_COMMAND, ID_SHORTCUT, 0);
break;
}
lvi.mask = LVIF_PARAM;
lvi.iSubItem = 0;
lvi.iItem = pnm->iItem;
if (lvi.iItem == 0) {
// Allow them to make a new item.
PostMessage(v_hMainWnd, WM_COMMAND,
ID_CONNECTIONS_MAKENEWCONNECTION, 0);
} else if (lvi.iItem != -1) {
ListView_SetItemState (v_hListWnd, lvi.iItem,
LVIS_SELECTED, LVIS_SELECTED);
// They want to connect.
SendMessage(v_hMainWnd, WM_COMMAND,
ID_FILE_CONNECTCREATE, 0);
}
break;
case LVN_KEYDOWN:
switch (((LV_KEYDOWN *) plvdi)->wVKey) {
case VK_RETURN :
lvi.iItem = ListView_GetNextItem(v_hListWnd, -1,
LVNI_SELECTED);
if (lvi.iItem == 0) {
PostMessage(v_hMainWnd, WM_COMMAND,
ID_CONNECTIONS_MAKENEWCONNECTION, 0);
} else if (lvi.iItem != -1) {
ListView_SetItemState (v_hListWnd, lvi.iItem,
LVIS_SELECTED, LVIS_SELECTED);
// They want to connect.
SendMessage(v_hMainWnd, WM_COMMAND,
ID_FILE_CONNECTCREATE, 0);
}
break;
case VK_CONTROL :
if (GetAsyncKeyState(VK_MENU)) {
PostMessage(v_hMainWnd, WM_COMMAND,
&nbs |
|