void __declspec(dllexport) SetUserData(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra) { HWND hwCtl; // struct nsControl* ctl; // struct s_control sCtl; // sCtl.controls = (struct control*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct control)); // get info from stack hwCtl = (HWND) popint(); if (!IsWindow(hwCtl)) { popint(); // remove user data from stack return; } // get descriptor // ctl = GetControl(hwCtl); // ctl = (struct nsControl*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct nsControl)); ctl = GetControl(hwCtl); if (ctl == NULL) return; // set user data popstringn(ctl->userData, USERDATA_SIZE); // ctl = NULL; }
void __declspec(dllexport) SetUserData(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra) { HWND hwCtl; struct nsControl* ctl; // get info from stack hwCtl = (HWND) popint(); if (!IsWindow(hwCtl)) { popint(); // remove user data from stack return; } // get descriptor ctl = GetControl(hwCtl); if (ctl == NULL) return; // set user data popstringn(ctl->userData, USERDATA_SIZE); }
int NSISCALL popint_or() { char buf[128]; if (popstringn(buf,sizeof(buf))) return 0; return myatoi_or(buf); }
int NSISCALL popint() { char buf[128]; if (popstringn(buf,sizeof(buf))) return 0; return atoi(buf); }
int NSISCALL popint_or() { TCHAR buf[128]; if (popstringn(buf,sizeof(buf)/sizeof(TCHAR))) return 0; return myatoi_or(buf); }
int NSISCALL PopStringNA(char* ansiStr, int maxlen) { int realLen = maxlen ? maxlen : g_stringsize; wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, realLen*sizeof(wchar_t)); int rval = popstringn(wideStr, realLen); WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, realLen, NULL, NULL); GlobalFree((HGLOBAL)wideStr); return rval; }
int NSISCALL PopStringNW(wchar_t* wideStr, int maxlen) { int realLen = maxlen ? maxlen : g_stringsize; char* ansiStr = (char*) GlobalAlloc(GPTR, realLen); int rval = popstringn(ansiStr, realLen); MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, realLen); GlobalFree((HGLOBAL)ansiStr); return rval; }
void __declspec(dllexport) CreateControl(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra) { char *className; char *text; HWND hwItem; int x, y, width, height; DWORD style, exStyle; size_t id; // get info from stack className = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_stringsize * 2); text = &className[g_stringsize]; if (!className) { pushstring("error"); return; } if (popstringn(className, 0)) { pushstring("error"); HeapFree(GetProcessHeap(), 0, className); return; } style = (DWORD) popint_or(); exStyle = (DWORD) popint_or(); PopPlacement(&x, &y, &width, &height); if (popstringn(text, 0)) { pushstring("error"); HeapFree(GetProcessHeap(), 0, className); return; } // create item descriptor id = g_dialog.controlCount; g_dialog.controlCount++; g_dialog.controls = (struct nsControl*) HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, g_dialog.controls, g_dialog.controlCount * sizeof(struct nsControl)); if (!lstrcmpi(className, "BUTTON")) g_dialog.controls[id].type = NSCTL_BUTTON; else if (!lstrcmpi(className, "EDIT")) g_dialog.controls[id].type = NSCTL_EDIT; else if (!lstrcmpi(className, "COMBOBOX")) g_dialog.controls[id].type = NSCTL_COMBOBOX; else if (!lstrcmpi(className, "LISTBOX")) g_dialog.controls[id].type = NSCTL_LISTBOX; else if (!lstrcmpi(className, "RichEdit")) g_dialog.controls[id].type = NSCTL_RICHEDIT; else if (!lstrcmpi(className, "RICHEDIT_CLASS")) g_dialog.controls[id].type = NSCTL_RICHEDIT2; else if (!lstrcmpi(className, "STATIC")) g_dialog.controls[id].type = NSCTL_STATIC; else if (!lstrcmpi(className, "LINK")) g_dialog.controls[id].type = NSCTL_LINK; else g_dialog.controls[id].type = NSCTL_UNKNOWN; // apply rtl to style ConvertStyleToRTL(g_dialog.controls[id].type, &style, &exStyle); // create item's window hwItem = CreateWindowEx( exStyle, lstrcmpi(className, "LINK") ? className : "BUTTON", text, style, x, y, width, height, g_dialog.hwDialog, (HMENU) (1200 + id), g_hInstance, NULL); g_dialog.controls[id].window = hwItem; // remember id SetProp(hwItem, NSCONTROL_ID_PROP, (HANDLE) (id + 1)); // set font SendMessage(hwItem, WM_SETFONT, SendMessage(g_dialog.hwParent, WM_GETFONT, 0, 0), TRUE); // set the WndProc for the link control if(g_dialog.controls[id].type == NSCTL_LINK) g_dialog.controls[id].oldWndProc = (WNDPROC) SetWindowLong(hwItem, GWL_WNDPROC, (long) LinkWndProc); // push back result pushint((int) hwItem); // done HeapFree(GetProcessHeap(), 0, className); }
void __declspec(dllexport) SelectFileDialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { OPENFILENAME ofn={0,}; // XXX WTF int save; TCHAR type[5]; const int len = 1024; // Avoid _chkstk by using allocated arrays. TCHAR* path = (TCHAR*) GlobalAlloc(GPTR, len*sizeof(TCHAR)); TCHAR* filter =(TCHAR*) GlobalAlloc(GPTR, len*sizeof(TCHAR)); TCHAR* currentDirectory = (TCHAR*) GlobalAlloc(GPTR, len*sizeof(TCHAR)); TCHAR* initialDir = (TCHAR*) GlobalAlloc(GPTR, len*sizeof(TCHAR)); DWORD gfa; EXDLL_INIT(); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwndParent; ofn.lpstrFilter = filter; ofn.lpstrFile = path; ofn.nMaxFile = len; //ofn.Flags = pField->nFlags & (OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_CREATEPROMPT | OFN_EXPLORER); ofn.Flags = OFN_CREATEPROMPT | OFN_EXPLORER; popstringn(type, len); popstringn(path, len); popstringn(filter, len); save = !lstrcmpi(type, _T("save")); // Check if the path given is a folder. If it is we initialize the // ofn.lpstrInitialDir parameter gfa = GetFileAttributes(path); if ((gfa != INVALID_FILE_ATTRIBUTES) && (gfa & FILE_ATTRIBUTE_DIRECTORY)) { lstrcpy(initialDir, path); ofn.lpstrInitialDir = initialDir; path[0] = _T('\0'); // disable initial file selection as path is actually a directory } if (!filter[0]) { lstrcpy(filter, _T("All Files|*.*")); } { // Convert the filter to the format required by Windows: NULL after each // item followed by a terminating NULL TCHAR *p = filter; while (*p) // XXX take care for 1024 { if (*p == _T('|')) { *p++ = 0; } else { p = CharNext(p); } } p++; *p = 0; } GetCurrentDirectory(sizeof(currentDirectory), currentDirectory); // save working dir if ((save ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn))) { pushstring(path); } else if (CommDlgExtendedError() == FNERR_INVALIDFILENAME) { *path = _T('\0'); if ((save ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn))) { pushstring(path); } else { pushstring(_T("")); } } else { pushstring(_T("")); } // restore working dir // OFN_NOCHANGEDIR doesn't always work (see MSDN) SetCurrentDirectory(currentDirectory); GlobalFree(path); GlobalFree(filter); GlobalFree(currentDirectory); GlobalFree(initialDir); }
void __declspec(dllexport) SelectFolderDialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { BROWSEINFO bi; TCHAR result[MAX_PATH]; TCHAR initial[MAX_PATH]; TCHAR title[1024]; LPITEMIDLIST resultPIDL; EXDLL_INIT(); if (popstringn(title, sizeof(title)/sizeof(title[0]))) { pushstring(_T("error")); return; } if (popstringn(initial, sizeof(initial)/sizeof(initial[0]))) { pushstring(_T("error")); return; } bi.hwndOwner = hwndParent; bi.pidlRoot = NULL; bi.pszDisplayName = result; bi.lpszTitle = title; #ifndef BIF_NEWDIALOGSTYLE #define BIF_NEWDIALOGSTYLE 0x0040 #endif bi.ulFlags = BIF_STATUSTEXT | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM) initial; bi.iImage = 0; /*if (pField->pszRoot) { LPSHELLFOLDER sf; ULONG eaten; LPITEMIDLIST root; int ccRoot = (lstrlen(pField->pszRoot) * 2) + 2; LPWSTR pwszRoot = (LPWSTR) MALLOC(ccRoot); MultiByteToWideChar(CP_ACP, 0, pField->pszRoot, -1, pwszRoot, ccRoot); SHGetDesktopFolder(&sf); sf->ParseDisplayName(hConfigWindow, NULL, pwszRoot, &eaten, &root, NULL); bi.pidlRoot = root; sf->Release(); FREE(pwszRoot); }*/ resultPIDL = SHBrowseForFolder(&bi); if (!resultPIDL) { pushstring(_T("error")); return; } if (SHGetPathFromIDList(resultPIDL, result)) { pushstring(result); } else { pushstring(_T("error")); } CoTaskMemFree(resultPIDL); }
void __declspec(dllexport) Create(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra) { // MSG Msg; WNDCLASS WndClass; HWND dhwPlacementRect; //HWND whwPlacementRect; HWND hwParent; //add by zhfi // HWND hwWindow; //add by zhfi //对话框尺寸 RECT drcPlacement; //父窗口窗口位置 RECT wrcPlacement; //WINDOWPLACEMENT *lpwndpl; int X, Y, nWidth, nHeight; DWORD dwExStyle, dwStyle; //LPCTSTR lpClassName, lpWindowName; char *lpClassName; char *lpWindowName; // s_plugins = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_stringsize * 2); lpClassName = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_stringsize * 2); lpWindowName = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, NSWINDOWS_MAX_STRLEN * 2); EXDLL_INIT(); // MessageBox(hwndParent,"EXDLL_INIT",NULL,MB_OK); extra->RegisterPluginCallback(g_hInstance, PluginCallback); // MessageBox(hwndParent,"RegisterPluginCallback",NULL,MB_OK); //add by zhfi hwParent = (HWND) (popint()); // MessageBox(hwndParent,"hwParent = (HWND) (popint())",NULL,MB_OK); if (IsWindow(hwParent)) g_window.hwParent = hwParent; else g_window.hwParent = hwndParent; //获取窗口位置 if (GetWindowRect(g_window.hwParent, &wrcPlacement)) { X = wrcPlacement.left; Y = wrcPlacement.top; nWidth = wrcPlacement.right - wrcPlacement.left; nHeight = wrcPlacement.bottom - wrcPlacement.top; } else { X = 300; Y = 200; nWidth = 300; nHeight = 200; } g_pluginParms = NULL; // MessageBox(hwndParent,"g_pluginParms",NULL,MB_OK); // popstringn(lpWindowName, 0); dwExStyle = (DWORD) popint_or(); // MessageBox(hwndParent,lpWindowName,NULL,MB_OK); // popstringn(lpWindowName, 0); dwStyle = (DWORD) popint_or(); // MessageBox(hwndParent,lpWindowName,NULL,MB_OK); lpClassName = "#32770"; popstringn(lpWindowName, NSWINDOWS_MAX_STRLEN); // MessageBox(hwndParent,lpWindowName,NULL,MB_OK); { // MEMSET (&WndClass,0,sizeof(WNDCLASS)); // HeapAlloc(&WndClass, GMEM_MOVEABLE, sizeof(WNDCLASS)); WndClass.style = dwStyle; WndClass.lpfnWndProc = WindowProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = g_hInstance; WndClass.hIcon = LoadIcon(NULL, "END"); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.lpszMenuName = NULL; WndClass.lpszClassName = lpClassName; // MessageBox(hwndParent,"WndClass.lpszClassName",NULL,MB_OK); RegisterClass(&WndClass); } // MessageBox(hwndParent,"RegisterClass",NULL,MB_OK); g_window.hwWindow=CreateWindowEx(dwExStyle, WndClass.lpszClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hwParent, NULL, g_hInstance, NULL); if (g_window.hwWindow == NULL) { pushstring("error"); return; } // MessageBox(hwndParent,"CreateWindowEx",NULL,MB_OK); g_pluginParms = extra; dhwPlacementRect = GetDlgItem(hwndParent, popint()); if (IsWindow(dhwPlacementRect)) if (GetWindowRect(dhwPlacementRect, &drcPlacement)) { MapWindowPoints(NULL, hwndParent, (LPPOINT) &drcPlacement, 2); nWidth = drcPlacement.right - drcPlacement.left; nHeight = drcPlacement.bottom - drcPlacement.top; } X = X + (wrcPlacement.right - wrcPlacement.left - nWidth) / 2; Y = Y + (wrcPlacement.bottom - wrcPlacement.top - nHeight) / 2; SetWindowPos( g_window.hwWindow, 0, X, Y, nWidth, nHeight, SWP_NOZORDER | SWP_NOACTIVATE| SWP_HIDEWINDOW ); g_window.rtl = FALSE; g_window.controlCount = 0; g_window.controls = (struct nsControl*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 0); // g_window.callbacks.onBack = 0; ShowWindow(g_window.hwWindow, SW_HIDE); pushint((int) g_window.hwWindow); }
void __declspec(dllexport) Utf8ToAnsi(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { EXDLL_INIT(); TCHAR path[1024]; popstringn(path, 1024); setuservariable(INST_9, utf_8_to_ansi(path)); }
void __declspec(dllexport) RemoveFromPath(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { EXDLL_INIT(); TCHAR path[1024]; popstringn(path, 1024); __RemoveFromPath(path); }