void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC) { HANDLE hf; // file handle BITMAPFILEHEADER hdr; // bitmap file-header PBITMAPINFOHEADER pbih; // bitmap info-header LPBYTE lpBits; // memory pointer DWORD dwTotal; // total count of bytes DWORD cb; // incremental count of bytes BYTE *hp; // byte pointer DWORD dwTmp; pbih = (PBITMAPINFOHEADER)pbi; lpBits = (LPBYTE)GlobalAlloc(GMEM_FIXED, pbih->biSizeImage); if (!lpBits) errhandler("GlobalAlloc", hwnd); // Retrieve the color table (RGBQUAD array) and the bits // (array of palette indices) from the DIB. if (!GetDIBits(hDC, hBMP, 0, (WORD)pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS)) { errhandler("GetDIBits", hwnd); } // Create the .BMP file. hf = CreateFile(pszFile, GENERIC_READ | GENERIC_WRITE, (DWORD)0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL); if (hf == INVALID_HANDLE_VALUE) errhandler("CreateFile", hwnd); hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" // Compute the size of the entire file. hdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage); hdr.bfReserved1 = 0; hdr.bfReserved2 = 0; // Compute the offset to the array of color indices. hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD); // Copy the BITMAPFILEHEADER into the .BMP file. if (!WriteFile(hf, (LPVOID)&hdr, sizeof(BITMAPFILEHEADER), (LPDWORD)&dwTmp, NULL)) { errhandler("WriteFile", hwnd); } // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. if (!WriteFile(hf, (LPVOID)pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof(RGBQUAD), (LPDWORD)&dwTmp, (NULL))) errhandler("WriteFile", hwnd); // Copy the array of color indices into the .BMP file. dwTotal = cb = pbih->biSizeImage; hp = lpBits; if (!WriteFile(hf, (LPSTR)hp, (int)cb, (LPDWORD)&dwTmp, NULL)) errhandler("WriteFile", hwnd); // Close the .BMP file. if (!CloseHandle(hf)) errhandler("CloseHandle", hwnd); // Free memory. GlobalFree((HGLOBAL)lpBits); }
HGLOBAL watchGlobalAlloc(UINT Flags, UINT size) { HGLOBAL block = GlobalAlloc(Flags, size); blocks[blocksnum++] = block; return block; }
BOOL CCalcFrameDlg::OnCommand(WPARAM wParam, LPARAM lParam) { UpdateData(TRUE); switch ( LOWORD(wParam) ) { case ID_32771: //标准型 { CMenu *pMenu = GetMenu()->GetSubMenu(0); if( pMenu != NULL ) { pMenu->CheckMenuItem(ID_32771,MF_CHECKED); pMenu->CheckMenuItem(ID_32772,MF_UNCHECKED); } OnBnClickedBtC(); if( m_enWindowStyle == en_Normal ) return TRUE; m_enWindowStyle = en_Normal; PostMessage(WM_SIZE); } break; case ID_32772: //科学型 { CMenu *pMenu = GetMenu()->GetSubMenu(0); if( pMenu != NULL ) { pMenu->CheckMenuItem(ID_32772,MF_CHECKED); pMenu->CheckMenuItem(ID_32771,MF_UNCHECKED); } OnBnClickedBtC(); if( m_enWindowStyle == en_Science ) return TRUE; m_enWindowStyle = en_Science; PostMessage(WM_SIZE); } break; case ID_32773: //最前显示 { m_bFront = !m_bFront; GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_32773,m_bFront?MF_CHECKED:MF_UNCHECKED); SetWindowPos(m_bFront? &wndTopMost : &wndNoTopMost,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE); } break; case ID_32775: { //打开剪切板 if (OpenClipboard()==FALSE) return TRUE; if (EmptyClipboard()==FALSE) { CloseClipboard(); return TRUE; } //复制数据 HANDLE hData=GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,m_strOutPut.GetLength()+1); if (hData==NULL) { CloseClipboard(); return TRUE; } LPTSTR szMemName=(LPTSTR)GlobalLock(hData); lstrcpy(szMemName,m_strOutPut); SetClipboardData(CF_TEXT,hData); GlobalUnlock(hData); CloseClipboard(); break; } case ID_32776: { //判断剪贴板的数据格式是否可以处理。 if (!IsClipboardFormatAvailable(CF_TEXT)) return TRUE; //打开剪贴板。 if (!OpenClipboard()) return TRUE; //获取UNICODE的数据。 HGLOBAL hMem = GetClipboardData(CF_TEXT); if (hMem != NULL) { LPTSTR lpStr = (LPTSTR)GlobalLock(hMem); if (lpStr != NULL) { for (int i=0;i<strlen(lpStr);i++) { BYTE bTemp = lpStr[i]-'0'; if(bTemp<0 || bTemp>9) { AfxMessageBox(TEXT("黏贴的字符不符合标准!"),MB_ICONSTOP); return TRUE; } } m_strOutPut = lpStr; //释放锁内存。 GlobalUnlock(hMem); } } //关闭剪贴板。 CloseClipboard(); } break; case ID_ABOUTBOX: //关于窗口 { CAboutDlg dlgAbout; dlgAbout.DoModal(); } break; case IDC_BT_0: case IDC_BT_1: case IDC_BT_2: case IDC_BT_3: case IDC_BT_4: case IDC_BT_5: case IDC_BT_6: case IDC_BT_7: case IDC_BT_8: case IDC_BT_9: { UpdateData(TRUE); if ( !m_bPressEnable ) break; CString str; str.Format(TEXT("%d"),LOWORD(wParam)-IDC_BT_0); //之前是用+-*/做的运算结果,那么显示的结果在这里清除 if ( !m_bPressNumber ) { m_strOutPut = str; m_bPressNumber = true; } else { if ( (m_strOutPut.GetAt(0) == '0') && (m_strOutPut.GetAt(1) != '.')) m_strOutPut = str; else m_strOutPut+=str; } m_bIsBaseCalc = false; } break; case IDC_BT_DIAN: { bool bInsertPoint = true; m_bIsBaseCalc = false; //查询输入的字符串中是否有小数点 for(int i=0;i<m_strOutPut.GetLength();i++) { if( m_strOutPut.GetAt(i) == '.') { bInsertPoint = false; break;; } } if( bInsertPoint ) m_strOutPut+=TEXT("."); } break; case IDC_BT_SAVE: //存储 { m_ListSave.AddString(m_strOutPut); GetDlgItem(IDC_STATIC_M)->ShowWindow(SW_SHOW); if( m_bShowSave == false ) { m_bShowSave = true; CRect rcClient; GetClientRect(&rcClient); RectifyControl(rcClient.Width(),rcClient.Height()); } } break; case IDC_BT_CE: { if( !m_bPressNumber ) break; m_strOutPut = TEXT("0"); } break; case IDC_BT_LEFT: //退位 { if( !m_bPressNumber ) break; m_strOutPut = m_strOutPut.Left(m_strOutPut.GetLength()-1); if ( m_strOutPut.GetLength() == 0 ) { m_strOutPut=TEXT("0"); } } break; case IDC_BT_FUSHU: //负数符号 { if( m_strOutPut.GetAt(0) == '-' ) m_strOutPut = m_strOutPut.Right(m_strOutPut.GetLength()-1); else m_strOutPut.Insert(0,'-'); } break; case IDC_BT_KAIFANG: { InsertRecord(en_Record_Sqrt); m_strOutPut.Format(TEXT("%.15lf"),sqrt(strtod(m_strOutPut,NULL))); //去除后面没用的0 CheckData(m_strOutPut); m_bPressEnable = false; } break; } UpdateData(FALSE); return CDialog::OnCommand(wParam, lParam); }
void CFdDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here ElapsedTime = CTime::GetCurrentTime() - StartTime; ae->ElapsedTime += ElapsedTime.GetTotalSeconds(); ae->NumberOfPaints += NumberOfPaints; StartTime = CTime::GetCurrentTime(); NumberOfPaints = 0L; ar.Write((void far *)ae, sizeof(ACKENG)); TRACE("...Game Saved...\n"); if (fds) fds->TextMsg("Game Saved"); DocAction = -1; } else { // TODO: add loading code here HGLOBAL haet; ACKENG *aet; haet = GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, sizeof(ACKENG)); if (haet == NULL) { TRACE("GlobalAlloc in CFdDoc of temporary ACKENG struct failed\n"); return; } aet = (ACKENG far *)GlobalLock(haet); if (ar.GetFile()->GetLength() == sizeof(ACKENG)) { ar.Read((void far *)aet, sizeof(ACKENG)); if (aet->Version == AE_VERSION && lstrcmp(aet->Descriptor,AE_DESCRIPTOR) == 0) { memmove((void far *)ae, (void far *)aet, sizeof(ACKENG)); // Initialize weapons ammo pointers ae->WeaponsCarried[0].Ammo = &ae->Fists; ae->WeaponsCarried[1].Ammo = &ae->Bullets; ae->WeaponsCarried[2].Ammo = &ae->Shells; ae->WeaponsCarried[3].Ammo = &ae->Bullets; ae->WeaponsCarried[4].Ammo = &ae->Rockets; if (!ae->ObjList[PLAYER_OBJECT].Dead) ViewUpDown = 32 << (8 - ViewLowRes); TRACE("...Game Loaded...\n"); if (fds) { fds->TextHealth(); fds->TextAmmo(); fds->TextMsg("Game Loaded"); fds->DrawKeys(); } StartTime = CTime::GetCurrentTime(); NumberOfPaints = 0L; OurView->GetParentFrame()->SetWindowText("WinAdv"); if (fdm) fdm->InvalidateRect(NULL,FALSE); DocAction = 1; } else { AfxMessageBox("Saved file format does not match\n"); TRACE("Saved file format does not match\n"); } } else { AfxMessageBox("Saved file size is not compatible\n"); TRACE("Saved file size is not compatible\n"); } GlobalUnlock(haet); GlobalFree(haet); } }
void *globalrealloc(void *oldp,size_t newsize) { #if 0 void *p; // Initialize heap if (!hHeap) { hHeap = HeapCreate(0,0x10000,0); if (!hHeap) os_error(); } newsize = (newsize + 3) & ~3L; // round up to dwords if (newsize == 0) { if (oldp && HeapFree(hHeap,0,oldp) == FALSE) os_error(); p = NULL; } else if (!oldp) { p = newsize ? HeapAlloc(hHeap,0,newsize) : NULL; } else p = HeapReAlloc(hHeap,0,oldp,newsize); #elif 1 MEMORY_BASIC_INFORMATION query; void *p; BOOL bSuccess; if (!oldp) p = VirtualAlloc (NULL, newsize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); else { VirtualQuery (oldp, &query, sizeof(query)); if (!newsize) { p = NULL; goto L1; } else { newsize = (newsize + 0xFFFF) & ~0xFFFFL; if (query.RegionSize >= newsize) p = oldp; else { p = VirtualAlloc(NULL,newsize,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE); if (p) memcpy(p,oldp,query.RegionSize); L1: bSuccess = VirtualFree(oldp,query.RegionSize,MEM_DECOMMIT); if (bSuccess) bSuccess = VirtualFree(oldp,0,MEM_RELEASE); if (!bSuccess) os_error(); } } } #else void *p; if (!oldp) p = (void *)GlobalAlloc (0, newsize); else if (!newsize) { GlobalFree(oldp); p = NULL; } else p = (void *)GlobalReAlloc(oldp,newsize,0); #endif dbg_printf("globalrealloc(oldp = %p, size = x%x) = %p\n",oldp,newsize,p); return p; }
static void marshal_WdtpInterfacePointer(DWORD umcb_ctx, DWORD ctx) { USER_MARSHAL_CB umcb; MIDL_STUB_MESSAGE stub_msg; RPC_MESSAGE rpc_msg; unsigned char *buffer, *buffer_end; ULONG size; IUnknown *unk; IUnknown *unk2; unsigned char *wireip; HGLOBAL h = GlobalAlloc(GMEM_MOVEABLE, 0); IStream *stm; void *marshal_data; LARGE_INTEGER zero; ULARGE_INTEGER pos; DWORD marshal_size; /* shows that the WdtpInterfacePointer functions don't marshal anything for * NULL pointers, so code using these functions must handle that case * itself */ unk = NULL; init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, umcb_ctx); size = WdtpInterfacePointer_UserSize(&umcb.Flags, ctx, 0, unk, &IID_IUnknown); ok(size == 0, "size should be 0 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); buffer_end = WdtpInterfacePointer_UserMarshal(&umcb.Flags, ctx, buffer, unk, &IID_IUnknown); wireip = buffer; HeapFree(GetProcessHeap(), 0, buffer); /* Now for a non-NULL pointer. The marshalled data are two size DWORDS and then the result of CoMarshalInterface called with the LOWORD of the ctx */ unk = &Test_Unknown; CreateStreamOnHGlobal(h, TRUE, &stm); CoMarshalInterface(stm, &IID_IUnknown, unk, LOWORD(ctx), NULL, MSHLFLAGS_NORMAL); zero.QuadPart = 0; IStream_Seek(stm, zero, STREAM_SEEK_CUR, &pos); marshal_size = pos.u.LowPart; marshal_data = GlobalLock(h); trace("marshal_size %x\n", marshal_size); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, umcb_ctx); size = WdtpInterfacePointer_UserSize(&umcb.Flags, ctx, 0, unk, &IID_IUnknown); ok(size >= marshal_size + 2 * sizeof(DWORD), "marshal size %x got %x\n", marshal_size, size); trace("WdtpInterfacePointer_UserSize returned %x\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, umcb_ctx); buffer_end = WdtpInterfacePointer_UserMarshal(&umcb.Flags, ctx, buffer, unk, &IID_IUnknown); wireip = buffer; ok(buffer_end == buffer + marshal_size + 2 * sizeof(DWORD), "buffer_end %p buffer %p\n", buffer_end, buffer); ok(*(DWORD *)wireip == marshal_size, "wireip + 0x0 should be %x instead of %x\n", marshal_size, *(DWORD *)wireip); wireip += sizeof(DWORD); ok(*(DWORD *)wireip == marshal_size, "wireip + 0x4 should be %x instead of %x\n", marshal_size, *(DWORD *)wireip); wireip += sizeof(DWORD); ok(!memcmp(marshal_data, wireip, marshal_size), "buffer mismatch\n"); GlobalUnlock(h); zero.QuadPart = 0; IStream_Seek(stm, zero, STREAM_SEEK_SET, NULL); CoReleaseMarshalData(stm); IStream_Release(stm); unk2 = NULL; init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, umcb_ctx); WdtpInterfacePointer_UserUnmarshal(&umcb.Flags, buffer, &unk2, &IID_IUnknown); ok(unk2 != NULL, "IUnknown object didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_INPROC); WdtpInterfacePointer_UserFree(unk2); }
PCHAR* CommandLineToArgvA(PCHAR CmdLine, int* _argc) { PCHAR* argv; PCHAR _argv; ULONG len; ULONG argc; CHAR a; ULONG i, j; BOOLEAN in_QM; BOOLEAN in_TEXT; BOOLEAN in_SPACE; len = strlen(CmdLine); i = ((len + 2) / 2)*sizeof(PVOID)+sizeof(PVOID); argv = (PCHAR*)GlobalAlloc(GMEM_FIXED, i + (len + 2)*sizeof(CHAR)); if (!argv) return 0; _argv = (PCHAR)(((PUCHAR)argv) + i); argc = 0; argv[argc] = _argv; in_QM = FALSE; in_TEXT = FALSE; in_SPACE = TRUE; i = 0; j = 0; while (a = CmdLine[i]) { if (in_QM) { if (a == '\"') { in_QM = FALSE; } else { _argv[j] = a; j++; } } else { switch (a) { case '\"': in_QM = TRUE; in_TEXT = TRUE; if (in_SPACE) { argv[argc] = _argv + j; argc++; } in_SPACE = FALSE; break; case ' ': case '\t': case '\n': case '\r': if (in_TEXT) { _argv[j] = '\0'; j++; } in_TEXT = FALSE; in_SPACE = TRUE; break; default: in_TEXT = TRUE; if (in_SPACE) { argv[argc] = _argv + j; argc++; } _argv[j] = a; j++; in_SPACE = FALSE; break; } } i++; } _argv[j] = '\0'; argv[argc] = NULL; (*_argc) = argc; return argv; }
void COnlineUsersDlg::MenuCommand(UINT uCmd) { int nUserID = 0; int count = m_wndUsers.GetItemCount(); for(int i=0;i<count;i++) { if(m_wndUsers.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED) nUserID = m_wndUsers.GetItemData(i); } User user = {0}; TT_GetUser(ttInst, nUserID, &user); Channel chan = {0}; TT_GetChannel(ttInst, user.nChannelID, &chan); switch(uCmd) { case ID_POPUP_KICKANDBAN : TT_DoBanUser(ttInst, nUserID, 0); TT_DoKickUser(ttInst, nUserID, 0); break; case ID_POPUP_KICK : TT_DoKickUser(ttInst, nUserID, user.nChannelID); break; case ID_POPUP_OP : TT_DoChannelOpEx(ttInst, nUserID, user.nChannelID, chan.szOpPassword, !TT_IsChannelOperator(ttInst, nUserID, user.nChannelID)); break; case ID_POPUP_COPYUSERINFORMATION : { User user; if(TT_GetUser(ttInst, nUserID, &user)) { CString szText; CString szUserID; szUserID.Format(_T("%d"), user.nUserID); TTCHAR szChannel[TT_STRLEN] = _T(""); TT_GetChannelPath(ttInst, user.nChannelID, szChannel); szText = szUserID; szText += _T("\t"); szText += user.szNickname; szText += _T("\t"); szText += user.szStatusMsg; szText += _T("\t"); szText += user.szUsername; szText += _T("\t"); szText += szChannel; szText += _T("\t"); szText += user.szIPAddress; szText += _T("\t"); szText += GetVersion(user); OpenClipboard(); EmptyClipboard(); HGLOBAL hglbCopy; hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (szText.GetLength() + 1) * sizeof(TCHAR)); if(hglbCopy) { LPVOID szStr = GlobalLock(hglbCopy); memcpy(szStr, szText.GetBuffer(), (szText.GetLength() + 1) * sizeof(TCHAR)); GlobalUnlock(hglbCopy); #if defined(UNICODE) || defined(_UNICODE) SetClipboardData(CF_UNICODETEXT, hglbCopy); #else SetClipboardData(CF_TEXT, hglbCopy); #endif } CloseClipboard(); } } } }
void ClipboardData::ToClipboard() { // do we have a name to restore?? UINT format = uFormat; if ( dataName != NULL) { UINT u = RegisterClipboardFormat( dataName); if (u > 0) { // the format has changed it seems. format = u; } } switch (format) { case CF_HDROP: { ClipboardDropData* cdd = static_cast<ClipboardDropData*>(data); // get the size of the clipboard. size_t size = cdd->GetDropfilesSize(); if (size > 0) { // make some room for this DROPFILES item. HGLOBAL hGlobal = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, size); // lock it so we can now use it. DROPFILES *df = (DROPFILES*)GlobalLock(hGlobal); // populate the data if we can. if (cdd->PopulateDropFiles(df, size)) { // release the lock GlobalUnlock(hGlobal); // set the data in the clipboard. SetClipboardData(CF_HDROP, hGlobal); } else { // release the lock GlobalUnlock(hGlobal); // free the memory GlobalFree(hGlobal); } } } break; case CF_ENHMETAFILE: SetClipboardData(CF_ENHMETAFILE, CopyEnhMetaFile((HENHMETAFILE)data, NULL)); break; case CF_BITMAP: SetClipboardData(CF_BITMAP, CopyBitmap( (HBITMAP)data )); break; default: if (dataSize > 0) { // get some data HGLOBAL hGlobal = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, dataSize); void* pMem = GlobalLock(hGlobal); memcpy(pMem, data, dataSize); GlobalUnlock(hGlobal); // we can no save the data. SetClipboardData(format, hGlobal); } else { // there is no data to set... SetClipboardData(format, 0); } break; } }
tdata_t _TIFFmalloc(tsize_t s) { return ((tdata_t)GlobalAlloc(GMEM_FIXED, s)); }
void DoGetRepStuff(HWND hwnd, LPINSERTITEM pfr) { HD_ITEM hi; int ret; HD_ITEM FAR* pitem; HGLOBAL hglb; int iAlloc; hi.mask = pfr->mask; hi.cxy = pfr->cxy; if (pfr->Nullpitem) pitem = NULL; else pitem = &hi; hi.cchTextMax = pfr->cchTextMax; // hi.cchTextMax = MAX_PSZTEXT; hi.fmt = pfr->fmt; hi.lParam = pfr->lParam; if (hi.cchTextMax == 0) iAlloc = MAX_PSZTEXT; else iAlloc = hi.cchTextMax; if (pfr->NullpszText) hi.pszText = NULL; // can this be done ?? else { hglb = GlobalAlloc(GPTR, iAlloc); hi.pszText = (LPSTR) GlobalLock(hglb); // _fstrcpy(hi.pszText, pfr->pszText); } if (pfr->NullHwd) ret = Header_GetItem(NULL, pfr->index, pitem); else ret = Header_GetItem(pfr->hwnd, pfr->index, pitem); wsprintf(szDbgMsg, "%d = Header_GetItem(index = %d, \n\ mask = %x )", ret, pfr->index, hi.mask); MyDebugMsg(DM_TRACE, "%s", (LPCSTR) szDbgMsg); SetDlgItemInt(hwnd, IDC_INSERTRET, ret, TRUE) ; if (ret) { SetDlgItemInt(hwnd, IDC_INSERTCXY, hi.cxy, TRUE); SetDlgItemInt(hwnd, IDC_INSERTCCHTEXTMAX, hi.cchTextMax, TRUE); wsprintf(szTemp, szLongFilter, hi.lParam); SetDlgItemText(hwnd, IDC_INSERTLPARAM, szTemp); SetDlgItemText(hwnd, IDC_INSERTTEXT, hi.pszText); wsprintf(szTemp, "%04hx", hi.mask); SetDlgItemText(hwnd, IDC_INSERTMASK, szTemp); CheckDlgButton(hwnd, IDC_INSERTHDRIGHT, hi.fmt & HDF_RIGHT); CheckDlgButton(hwnd, IDC_INSERTHDLEFT, hi.fmt & HDF_LEFT); CheckDlgButton(hwnd, IDC_INSERTHDCENTER, hi.fmt & HDF_CENTER); CheckDlgButton(hwnd, IDC_INSERTHDJUSTIFYMASK, hi.fmt & HDF_JUSTIFYMASK); CheckDlgButton(hwnd, IDC_INSERTHDOWNERDRAW, hi.fmt & HDF_OWNERDRAW); CheckDlgButton(hwnd, IDC_INSERTHDSTRING, hi.fmt & HDF_STRING); CheckDlgButton(hwnd, IDC_INSERTHDBITMAP, hi.fmt & HDF_BITMAP); wsprintf(szTemp, szLongFilter, (DWORD) hi.hbm); SetDlgItemText(hwnd, IDC_INSERTHBM, szTemp); wsprintf(szTemp, "%04x", hi.fmt); // SetDlgItemInt(hwnd, IDC_INSERTFMT, hi.fmt, TRUE); SetDlgItemText(hwnd, IDC_INSERTFMT, szTemp); } if (!pfr->NullpszText) { GlobalUnlock(hglb); GlobalFree(hglb); } /**** wsprintf(szTemp, szLongFilter, hwndFind) ; SetDlgItemText(hwnd, ID_INSERTRET, szTemp) ; **/ }
void BookServerTest::testWord() { //static const WCHAR kFilePath[] = LR"(F:\bk\physics\quantum mechanics\exam\2009\09北京大学量子力学(记忆版).doc)"; DWORD rtfFormat = RegisterClipboardFormat(L"Rich Text Format"); static const WCHAR kFilePath[] = LR"(e:\test.docx)"; ComPtr<IMoniker> fileMoniker; auto hr = CreateFileMoniker(kFilePath, &fileMoniker); if (FAILED(hr)) return; ComPtr<IBindCtx> pbc; CreateBindCtx(0, &pbc); ComPtr<IDataObject> dataObject; hr = fileMoniker->BindToObject(pbc, NULL, IID_IDataObject, (void**)&dataObject); if (FAILED(hr)) return; ComPtr<IDataObject> dataObject2; hr = fileMoniker->BindToObject(pbc, NULL, IID_IDataObject, (void**)&dataObject2); if (FAILED(hr)) return; { ComPtr<IEnumFORMATETC> enumFormat; auto hr = dataObject->EnumFormatEtc(DATADIR_GET, &enumFormat); if (FAILED(hr)) return; FORMATETC format; std::vector<FORMATETC> getFormats; while ((hr = enumFormat->Next(1, &format, NULL)) == S_OK) { getFormats.push_back(format); } assert(getFormats.size() > 1); } { ComPtr<IEnumFORMATETC> enumFormat; auto hr = dataObject->EnumFormatEtc(DATADIR_SET, &enumFormat); if (FAILED(hr)) return; FORMATETC format; std::vector<FORMATETC> setFormats; while ((hr = enumFormat->Next(1, &format, NULL)) == S_OK) { setFormats.push_back(format); } assert(setFormats.size() > 1); } { FORMATETC etc = { 0 }; etc.cfFormat = CF_UNICODETEXT; etc.dwAspect = DVASPECT_CONTENT; etc.lindex = -1; etc.tymed = TYMED_HGLOBAL; STGMEDIUM stg = { 0 }; hr = dataObject->GetData(&etc, &stg); if (FAILED(hr)) return; auto ptr = GlobalLock(stg.hGlobal); assert(ptr); } { FORMATETC etc = { 0 }; etc.cfFormat = CF_TEXT; etc.dwAspect = DVASPECT_CONTENT; etc.lindex = -1; etc.tymed = TYMED_HGLOBAL; STGMEDIUM stg = { 0 }; hr = dataObject->GetData(&etc, &stg); if (FAILED(hr)) return; //return gbk encoding. auto ptr = GlobalLock(stg.hGlobal); assert(ptr); } { FORMATETC etc = { 0 }; etc.cfFormat = CF_TEXT; etc.dwAspect = DVASPECT_CONTENT; etc.lindex = -1; etc.tymed = TYMED_HGLOBAL; STGMEDIUM stg = { 0 }; const static CHAR kContent[] = "how to zhangbi\r\n"; auto hg = GlobalAlloc(GPTR, sizeof(kContent) + 1); auto ptr = (CHAR*)GlobalLock(hg); StringCchCopyA(ptr, sizeof(kContent), kContent); stg.tymed = TYMED_HGLOBAL; stg.hGlobal = hg; hr = dataObject->SetData(&etc, &stg, FALSE); if (FAILED(hr)) return; assert(stg.lpszFileName); ReleaseStgMedium(&stg); ComQIPtr<IPersistFile> file = dataObject; hr = file->Save(NULL, TRUE); if (FAILED(hr)) return; }
// get data functions STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium) { wxLogTrace(wxTRACE_OleCalls, wxT("wxIDataObject::GetData")); // is data is in our format? HRESULT hr = QueryGetData(pformatetcIn); if ( FAILED(hr) ) return hr; // for the bitmaps and metafiles we use the handles instead of global memory // to pass the data wxDataFormat format = (wxDataFormat::NativeFormat)pformatetcIn->cfFormat; format = HtmlFormatFixup(format); // is this system data? if ( GetSystemData(format, pmedium) ) { // pmedium is already filled with corresponding data, so we're ready. return S_OK; } switch ( format ) { case wxDF_BITMAP: pmedium->tymed = TYMED_GDI; break; case wxDF_ENHMETAFILE: pmedium->tymed = TYMED_ENHMF; break; #ifndef __WXWINCE__ case wxDF_METAFILE: pmedium->hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(METAFILEPICT)); if ( !pmedium->hGlobal ) { wxLogLastError(wxT("GlobalAlloc")); return E_OUTOFMEMORY; } pmedium->tymed = TYMED_MFPICT; break; #endif default: // alloc memory size_t size = m_pDataObject->GetDataSize(format); if ( !size ) { // it probably means that the method is just not implemented wxLogDebug(wxT("Invalid data size - can't be 0")); return DV_E_FORMATETC; } // we may need extra space for the buffer size size += m_pDataObject->GetBufferOffset( format ); HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, size); if ( hGlobal == NULL ) { wxLogLastError(wxT("GlobalAlloc")); return E_OUTOFMEMORY; } // copy data pmedium->tymed = TYMED_HGLOBAL; pmedium->hGlobal = hGlobal; } pmedium->pUnkForRelease = NULL; // do copy the data hr = GetDataHere(pformatetcIn, pmedium); if ( FAILED(hr) ) { // free resources we allocated if ( pmedium->tymed & (TYMED_HGLOBAL | TYMED_MFPICT) ) { GlobalFree(pmedium->hGlobal); } return hr; } return S_OK; }
LPLOCKBYTES ReadFileIntoMemory(const std::wstring& fileName) { HRESULT hr = S_OK; HANDLE file = INVALID_HANDLE_VALUE; file = ::CreateFileW(fileName.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(INVALID_HANDLE_VALUE == file) { DWORD lastError = GetLastError(); std::tostringstream msg; msg << _T("Failed to open [") << fileName << _T("] for reading its contents into memory, so we may read its custom properties") << std::ends; throw Workshare::System::SystemException(msg.str().c_str(), lastError); } try { unsigned long size = ::GetFileSize(file, NULL); HGLOBAL memory = GlobalAlloc(GPTR, size); if(NULL == memory) { DWORD lastError = GetLastError(); std::tostringstream msg; msg << _T("Failed to allocate ") << size << _T(" bytes of memory for reading [") << fileName << _T("] into memory, so we may read its custom properties") << std::ends; throw Workshare::System::SystemException(msg.str().c_str(), lastError); } try { DWORD numberOfBytesRead = 0; BOOL ok = ::ReadFile(file, memory, size, &numberOfBytesRead, NULL); if(!ok) { DWORD lastError = GetLastError(); std::tostringstream msg; msg << _T("Failed to read ") << size << _T(" bytes from [") << fileName << _T("] into a buffer that is ") << size << _T(" big, so we may read its custom properties") << std::ends; throw Workshare::System::SystemException(msg.str().c_str(), lastError); } if(size != numberOfBytesRead) { std::tostringstream msg; msg << _T("Failed to read all the ") << size << _T(" bytes from [") << fileName << _T("] into a buffer that is ") << size << _T(" big, so we may read its custom properties. Only ") << numberOfBytesRead << _T(" was read") << std::ends; throw Workshare::System::IO::IOException(msg.str().c_str()); } LPLOCKBYTES lpBytes = NULL; hr = CreateILockBytesOnHGlobal(memory, TRUE, &lpBytes); if(FAILED(hr)) { std::tostringstream msg; msg << _T("Failed to create an instance of ILockBytes from memory ") << size << _T(" bytes from [") << fileName << _T("] into a buffer that is ") << size << _T(" big, so we may read its custom properties. Only ") << numberOfBytesRead << _T(" was read") << std::ends; throw Workshare::System::IO::IOException(msg.str().c_str()); } CloseHandle(file); return lpBytes; } catch(...) { GlobalFree(memory); throw; } } catch(...) { CloseHandle(file); throw; } }
static void test_marshal_HGLOBAL(void) { USER_MARSHAL_CB umcb; MIDL_STUB_MESSAGE stub_msg; RPC_MESSAGE rpc_msg; unsigned char *buffer; ULONG size, block_size; HGLOBAL hglobal; HGLOBAL hglobal2; unsigned char *wirehglobal; int i; hglobal = NULL; init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal); /* native is poorly programmed and allocates 4/8 bytes more than it needs to * here - Wine doesn't have to emulate that */ ok((size == 8) || broken(size == 12) || broken(size == 16), "Size should be 8, instead of %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal); wirehglobal = buffer; ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); ok(*(ULONG *)wirehglobal == 0, "buffer+4 should be HGLOBAL\n"); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2); ok(hglobal2 == hglobal, "Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); HGLOBAL_UserFree(&umcb.Flags, &hglobal2); for(block_size = 0; block_size <= 17; block_size++) { ULONG actual_size, expected_size; hglobal = GlobalAlloc(0, block_size); buffer = GlobalLock(hglobal); for (i = 0; i < block_size; i++) buffer[i] = i; GlobalUnlock(hglobal); actual_size = GlobalSize(hglobal); expected_size = actual_size + 5 * sizeof(DWORD); trace("%d: actual size %d\n", block_size, actual_size); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal); /* native is poorly programmed and allocates 4/8 bytes more than it needs to * here - Wine doesn't have to emulate that */ ok(size == expected_size || broken(size == expected_size + 4) || broken(size == expected_size + 8), "%d: got size %d\n", block_size, size); buffer = HeapAlloc(GetProcessHeap(), 0, size); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal); wirehglobal = buffer; ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0x4 should be HGLOBAL\n"); wirehglobal += sizeof(ULONG); ok(*(ULONG *)wirehglobal == actual_size, "%d: buffer+0x8 %08x\n", block_size, *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0xc should be HGLOBAL\n"); wirehglobal += sizeof(ULONG); ok(*(ULONG *)wirehglobal == actual_size, "%d: buffer+0x10 %08x\n", block_size, *(ULONG *)wirehglobal); wirehglobal += sizeof(ULONG); for (i = 0; i < block_size; i++) ok(wirehglobal[i] == i, "buffer+0x%x should be %d\n", 0x10 + i, i); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2); ok(hglobal2 != NULL, "Didn't unmarshal properly\n"); HeapFree(GetProcessHeap(), 0, buffer); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); HGLOBAL_UserFree(&umcb.Flags, &hglobal2); GlobalFree(hglobal); } }
//VC下把HBITMAP保存为bmp图片 BOOL SaveBmp(HBITMAP hBitmap, CString FileName) { HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WORD wBitCount; //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0; //位图属性结构 BITMAP Bitmap; //位图文件头结构 BITMAPFILEHEADER bmfHdr; //位图信息头结构 BITMAPINFOHEADER bi; //指向位图信息头结构 LPBITMAPINFOHEADER lpbi; //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hDib, hPal, hOldPal = NULL; //计算位图文件每个像素所占字节数 hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); DeleteDC(hDC); if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else wBitCount = 24; GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrImportant = 0; bi.biClrUsed = 0; dwBmBitsSize = ((Bitmap.bmWidth *wBitCount + 31) / 32) * 4 * Bitmap.bmHeight; //为位图内容分配内存 hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi; // 处理调色板 hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC = ::GetDC(NULL); hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 获取该调色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); //恢复调色板 if (hOldPal) { ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } //创建位图文件 fh = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // 设置位图文件头 bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; // 写入位图文件头 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 写入位图文件其余内容 WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除 GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(fh); return TRUE; }
static void test_marshal_HMETAFILEPICT(void) { USER_MARSHAL_CB umcb; MIDL_STUB_MESSAGE stub_msg; RPC_MESSAGE rpc_msg; unsigned char *buffer, *buffer_end; ULONG size; HMETAFILEPICT hmfp; HMETAFILEPICT hmfp2 = NULL; METAFILEPICT *pmfp; unsigned char *wirehmfp; hmfp = GlobalAlloc(GMEM_MOVEABLE, sizeof(*pmfp)); pmfp = GlobalLock(hmfp); pmfp->mm = MM_ISOTROPIC; pmfp->xExt = 1; pmfp->yExt = 2; pmfp->hMF = create_mf(); GlobalUnlock(hmfp); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = HMETAFILEPICT_UserSize(&umcb.Flags, 0, &hmfp); ok(size > 20, "size should be at least 20 bytes, not %d\n", size); trace("size is %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); buffer_end = HMETAFILEPICT_UserMarshal(&umcb.Flags, buffer, &hmfp); wirehmfp = buffer; ok(*(DWORD *)wirehmfp == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(DWORD *)wirehmfp == (DWORD)(DWORD_PTR)hmfp, "wirestgm + 0x4 should be hmf instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(DWORD *)wirehmfp == MM_ISOTROPIC, "wirestgm + 0x8 should be MM_ISOTROPIC instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(DWORD *)wirehmfp == 1, "wirestgm + 0xc should be 1 instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(DWORD *)wirehmfp == 2, "wirestgm + 0x10 should be 2 instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(DWORD *)wirehmfp == USER_MARSHAL_PTR_PREFIX, "wirestgm + 0x14 should be \"User\" instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(DWORD *)wirehmfp == WDT_REMOTE_CALL, "wirestgm + 0x18 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); pmfp = GlobalLock(hmfp); ok(*(DWORD *)wirehmfp == (DWORD)(DWORD_PTR)pmfp->hMF, "wirestgm + 0x1c should be pmfp->hMF instead of 0x%08x\n", *(DWORD *)wirehmfp); GlobalUnlock(hmfp); wirehmfp += sizeof(DWORD); /* Note use (buffer_end - buffer) instead of size here, because size is an * overestimate with native */ ok(*(DWORD *)wirehmfp == (buffer_end - buffer - 0x28), "wirestgm + 0x20 should be size - 0x34 instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(DWORD *)wirehmfp == (buffer_end - buffer - 0x28), "wirestgm + 0x24 should be size - 0x34 instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(WORD *)wirehmfp == 1, "wirehmfp + 0x28 should be 1 instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); /* ... rest of data not tested - refer to tests for GetMetaFileBits * at this point */ init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); HMETAFILEPICT_UserUnmarshal(&umcb.Flags, buffer, &hmfp2); ok(hmfp2 != NULL, "HMETAFILEPICT didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); HMETAFILEPICT_UserFree(&umcb.Flags, &hmfp2); pmfp = GlobalLock(hmfp); DeleteMetaFile(pmfp->hMF); GlobalUnlock(hmfp); GlobalFree(hmfp); /* test NULL emf */ hmfp = NULL; init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); size = HMETAFILEPICT_UserSize(&umcb.Flags, 0, &hmfp); ok(size == 8, "size should be 8 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); HMETAFILEPICT_UserMarshal(&umcb.Flags, buffer, &hmfp); wirehmfp = buffer; ok(*(DWORD *)wirehmfp == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(DWORD *)wirehmfp == (DWORD)(DWORD_PTR)hmfp, "wirestgm + 0x4 should be hmf instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); hmfp2 = NULL; init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); HMETAFILEPICT_UserUnmarshal(&umcb.Flags, buffer, &hmfp2); ok(hmfp2 == NULL, "NULL HMETAFILE didn't unmarshal\n"); HeapFree(GetProcessHeap(), 0, buffer); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); HMETAFILEPICT_UserFree(&umcb.Flags, &hmfp2); }
int Screengrab::CaptureAnImage(HWND hWnd, std::wstring imageFilename) { HDC hdcScreen; HDC hdcWindow; HDC hdcMemDC = NULL; HBITMAP hbmScreen = NULL; BITMAP bmpScreen; // Retrieve the handle to a display device context for the client // area of the window. hdcScreen = GetDC(NULL); hdcWindow = GetDC(hWnd); // Create a compatible DC which is used in a BitBlt from the window DC hdcMemDC = CreateCompatibleDC(hdcWindow); if (!hdcMemDC) { MessageBox(hWnd, L"CreateCompatibleDC has failed", L"Failed", MB_OK); goto done; } // Get the client area for size calculation RECT rcClient; GetClientRect(hWnd, &rcClient); //This is the best stretch mode SetStretchBltMode(hdcWindow, HALFTONE); //The source DC is the entire screen and the destination DC is the current window (HWND) if (!StretchBlt(hdcWindow, 0, 0, rcClient.right, rcClient.bottom, hdcScreen, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SRCCOPY)) { MessageBox(hWnd, L"StretchBlt has failed", L"Failed", MB_OK); goto done; } // Create a compatible bitmap from the Window DC hbmScreen = CreateCompatibleBitmap(hdcWindow, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top); if (!hbmScreen) { MessageBox(hWnd, L"CreateCompatibleBitmap Failed", L"Failed", MB_OK); goto done; } // Select the compatible bitmap into the compatible memory DC. SelectObject(hdcMemDC, hbmScreen); // Bit block transfer into our compatible memory DC. if (!BitBlt(hdcMemDC, 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, hdcWindow, 0, 0, SRCCOPY)) { MessageBox(hWnd, L"BitBlt has failed", L"Failed", MB_OK); goto done; } // Get the BITMAP from the HBITMAP GetObject(hbmScreen, sizeof(BITMAP), &bmpScreen); BITMAPFILEHEADER bmfHeader; BITMAPINFOHEADER bi; bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bmpScreen.bmWidth; bi.biHeight = bmpScreen.bmHeight; bi.biPlanes = 1; bi.biBitCount = 32; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight; // Starting with 32-bit Windows, GlobalAlloc and LocalAlloc are implemented as wrapper functions that // call HeapAlloc using a handle to the process's default heap. Therefore, GlobalAlloc and LocalAlloc // have greater overhead than HeapAlloc. HANDLE hDIB = GlobalAlloc(GHND, dwBmpSize); char *lpbitmap = (char *)GlobalLock(hDIB); // Gets the "bits" from the bitmap and copies them into a buffer // which is pointed to by lpbitmap. GetDIBits(hdcWindow, hbmScreen, 0, (UINT)bmpScreen.bmHeight, lpbitmap, (BITMAPINFO *)&bi, DIB_RGB_COLORS); // A file is created, this is where we will save the screen capture. HANDLE hFile = CreateFile(imageFilename.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // Add the size of the headers to the size of the bitmap to get the total file size DWORD dwSizeofDIB = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //Offset to where the actual bitmap bits start. bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER); //Size of the file bmfHeader.bfSize = dwSizeofDIB; //bfType must always be BM for Bitmaps bmfHeader.bfType = 0x4D42; //BM DWORD dwBytesWritten = 0; WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL); WriteFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL); WriteFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &dwBytesWritten, NULL); //Unlock and Free the DIB from the heap GlobalUnlock(hDIB); GlobalFree(hDIB); //Close the handle for the file that was created CloseHandle(hFile); //Clean up done: DeleteObject(hbmScreen); DeleteObject(hdcMemDC); ReleaseDC(NULL, hdcScreen); ReleaseDC(hWnd, hdcWindow); return 0; }
/* error console dialog process */ BOOL CALLBACK callback_err_console( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_INITDIALOG : break; case WM_DESTROY : break; case WM_COMMAND : if( HIWORD( wParam ) == BN_CLICKED ) { switch( LOWORD( wParam ) ) { case IDOK : DestroyWindow( hWnd ); break; case IDC_COPYCLIP : if( OpenClipboard( hWnd ) ) { int i; int num_lines = SendDlgItemMessage( hWnd, IDC_CONSOLE, LB_GETCOUNT, 0, 0 ); int text_size; char *buffer; HGLOBAL clipbuffer; if( num_lines <= 0 ) break; /* calculate text size */ for( i = 0, text_size = 0; i < num_lines; i++ ) text_size += SendDlgItemMessage( hWnd, IDC_CONSOLE, LB_GETTEXTLEN, ( WPARAM )i, 0 ); /* CR-LF for each line + terminating NULL */ text_size += 2 * num_lines + 1; EmptyClipboard( ); clipbuffer = GlobalAlloc( GMEM_MOVEABLE | GMEM_DDESHARE, text_size ); buffer = (char *)GlobalLock( clipbuffer ); /* concatenate lines of text in the global buffer */ for( i = 0; i < num_lines; i++ ) { char msg_buf[1024]; SendDlgItemMessage( hWnd, IDC_CONSOLE, LB_GETTEXT, ( WPARAM )i, ( LPARAM )msg_buf ); strcat( msg_buf, "\r\n" ); memcpy( buffer, msg_buf, strlen( msg_buf ) ); buffer += strlen( msg_buf ); } *buffer = 0; /* null-terminate the buffer */ GlobalUnlock( clipbuffer ); SetClipboardData( CF_TEXT, clipbuffer ); CloseClipboard( ); } break; default : return 0; } break; } break; default : return DefWindowProc( hWnd, uMsg, wParam, lParam ); } return 0; }
extern "C" void CreateBMPFile(char *pszFile, HBITMAP hBMP, HDC hDC) //given a handle hBMP of a bitmap that is currently selected in the display context hDC, //creates a .bmp file named pszFile containing the bitmap //don't remember where I copied this from { int errorLevel; HANDLE hf; // file handle PBITMAPINFO pbi; // bitmap info BITMAPFILEHEADER hdr; // bitmap file-header PBITMAPINFOHEADER pbih; // bitmap info-header LPBYTE lpBits; // memory pointer DWORD dwTotal; // total count of bytes DWORD cb; // incremental count of bytes BYTE *hp; // byte pointer DWORD dwTmp; pbi = CreateBitmapInfoStruct(hBMP); pbih = (PBITMAPINFOHEADER) pbi; lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage); assert(lpBits); // Retrieve the color table (RGBQUAD array) and the bits // (array of palette indices) from the DIB. errorLevel = GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS); assert(errorLevel != 0); // Create the .BMP file. hf = CreateFile(pszFile, GENERIC_READ | GENERIC_WRITE, (DWORD) 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); assert(hf != INVALID_HANDLE_VALUE); hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" // Compute the size of the entire file. hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage); hdr.bfReserved1 = 0; hdr.bfReserved2 = 0; // Compute the offset to the array of color indices. hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof (RGBQUAD); // Copy the BITMAPFILEHEADER into the .BMP file. errorLevel = WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL); assert(errorLevel != 0); // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. errorLevel = WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof (RGBQUAD), (LPDWORD) &dwTmp, NULL); assert(errorLevel != 0); // Copy the array of color indices into the .BMP file. dwTotal = cb = pbih->biSizeImage; hp = lpBits; errorLevel = WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL); assert(errorLevel != 0); // Close the .BMP file. errorLevel = CloseHandle(hf); assert(errorLevel != 0); // Free memory. GlobalFree((HGLOBAL)lpBits); }
bool CMyV8Handler::Execute( const CefString& name, CefRefPtr<CefV8Value> object, const CefV8ValueList& arguments, CefRefPtr<CefV8Value>& retval, CefString& exception ) { if (name==_T("configInfo")) { retval= CefV8Value::CreateString(CefString(configInfo())); return true; } if (name==_T("clearPassword")) { GetUserDb()->DeleteUserInfo(); return true; } if (name==_T("changeHost")) { if (arguments.size()>0&&arguments[0]->IsString()) { CString strContent; strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); if(strContent.GetLength()>2) strContent=strContent.Mid(1,strContent.GetLength()-2); CString strTemp; if (COssApi::m_strHost!=_T("")) strTemp.Format(_T("\"%s\""),COssApi::m_strHost.c_str()); else strTemp.Format(_T("\"%s\""),GetStaroneControl()->ChangeHost(wstring(strContent)).c_str()); retval= CefV8Value::CreateString(CefString(strTemp)); } return true; } if (name==_T("loadFinish")) { GetStaroneControl()->m_bLoadFinish=TRUE; return true; } if (name==_T("showAuthorizationDlg")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); } CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgshowAuthorizationDlg")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); return true; } if (name==_T("showWnd")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgMain")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("closeWnd")) { CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgcloseWnd")); browser->SendProcessMessage(PID_RENDERER,msg); return true; } if (name==_T("setClipboardData")) { if (arguments.size()>0&&arguments[0]->IsString()) { CString strContent; strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); if(strContent.GetLength()>2) strContent=strContent.Mid(1,strContent.GetLength()-2); if(OpenClipboard(NULL)) { HGLOBAL clipbuffer; char *buffer; EmptyClipboard(); clipbuffer=GlobalAlloc(GMEM_DDESHARE,strContent.GetLength()*2+2); buffer=(char *)GlobalLock(clipbuffer); memset(buffer,0,strContent.GetLength()*2+2); memcpy(buffer,strContent.GetBuffer(0),strContent.GetLength()*2); GlobalUnlock(clipbuffer); SetClipboardData(CF_UNICODETEXT,clipbuffer); CloseClipboard(); } } return true; } if (name==_T("showLaunchpad")) { GetStaroenHummerDlg()->ShowLauchpad(); return true; } if (name==_T("getAccessID")) { CString strTemp; strTemp.Format(_T("\"%s\""),GetStaroneControl()->m_UserInfo.strAccessID); retval= CefV8Value::CreateString(CefString(strTemp)); return true; } if (name==_T("getSignature")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CString strTemp; strTemp.Format(_T("\"%s\""),GetSignature(strContent)); retval= CefV8Value::CreateString(CefString(strTemp)); } return true; } if (name==_T("getRamSignature")) { CString strCmd; CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strCmd.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); } if(arguments.size()>1&&arguments[1]->IsString()) { strContent.Format(_T("%s"),arguments[1]->GetStringValue().c_str()); } CString strTemp; strTemp.Format(_T("\"%s\""),getRamSignature(strCmd,strContent)); retval= CefV8Value::CreateString(CefString(strTemp)); return true; } if (name==_T("addFile")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgaddFile")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("saveFile")) { if (arguments.size()>=1&&arguments[0]->IsString()) { CString strContent; strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgsaveFile")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("saveFileDlg")) { if (arguments.size()==1) { CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>0) func=arguments[0]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=_T(""); hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgsaveFileDlg")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("selectFileDlg")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgselectFileDlg")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("getUpload")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); } retval = CefV8Value::CreateString(CefString(getUpload(strContent))); return true; } if (name==_T("getDownload")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); } retval = CefV8Value::CreateString(CefString(getDownload(strContent))); return true; } if (name==_T("startUpload")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; CHandlerTask *pTask=new CHandlerTask; pTask->Init(CefV8Context::GetCurrentContext(),object,func,strContent,_T("startUpload")); GetStaroneControl()->m_ThreadPool.AddTask(pTask); } return true; } if (name==_T("startDownload")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; CHandlerTask *pTask=new CHandlerTask; pTask->Init(CefV8Context::GetCurrentContext(),object,func,strContent,_T("startDownload")); GetStaroneControl()->m_ThreadPool.AddTask(pTask); } return true; } if (name==_T("stopUpload")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; CHandlerTask *pTask=new CHandlerTask; pTask->Init(CefV8Context::GetCurrentContext(),object,func,strContent,_T("stopUpload")); GetStaroneControl()->m_ThreadPool.AddTask(pTask); } return true; } if (name==_T("stopDownload")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; CHandlerTask *pTask=new CHandlerTask; pTask->Init(CefV8Context::GetCurrentContext(),object,func,strContent,_T("stopDownload")); GetStaroneControl()->m_ThreadPool.AddTask(pTask); } return true; } if (name==_T("deleteUpload")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; CHandlerTask *pTask=new CHandlerTask; pTask->Init(CefV8Context::GetCurrentContext(),object,func,strContent,_T("deleteUpload")); GetStaroneControl()->m_ThreadPool.AddTask(pTask); } return true; } if (name==_T("deleteDownload")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; CHandlerTask *pTask=new CHandlerTask; pTask->Init(CefV8Context::GetCurrentContext(),object,func,strContent,_T("deleteDownload")); GetStaroneControl()->m_ThreadPool.AddTask(pTask); } return true; } if (name==_T("setMetaObject")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; CHandlerTask *pTask=new CHandlerTask; pTask->Init(CefV8Context::GetCurrentContext(),object,func,strContent,_T("setMetaObject")); GetStaroneControl()->m_ThreadPool.AddTask(pTask); } return true; } if (name==_T("getClipboardData")) { retval = CefV8Value::CreateString(CefString(getClipboardData())); return true; } if (name==_T("getDragFiles")) { CString strContent=_T("{\"list\":["); for (int i=0;i<GetStaroneControl()->m_strDragList.size();i++) { if (i!=0) strContent+=_T(","); CString str; str.Format(_T("{\"path\":\"%s\"}"),slnhelper::ReplaceToJson(GetStaroneControl()->m_strDragList[i])); strContent+=str; } strContent+=_T("]}"); retval = CefV8Value::CreateString(CefString(strContent)); return true; } if (name==_T("deleteObject")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgdeleteObject")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("copyObject")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgcopyObject")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("changeUpload")) { CString strContent; CefRefPtr<CefV8Value> func=NULL; if(arguments.size()>0&&arguments[0]->IsString()) strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); if (arguments.size()>1) func=arguments[1]; GetCallbackUploadThread()->SetCallbackStatus(CefV8Context::GetCurrentContext(),object,func,strContent); return true; } if (name==_T("changeDownload")) { CString strContent; CefRefPtr<CefV8Value> func=NULL; if(arguments.size()>0&&arguments[0]->IsString()) strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); if (arguments.size()>1) func=arguments[1]; GetCallbackDownloadThread()->SetCallbackStatus(CefV8Context::GetCurrentContext(),object,func,strContent); return true; } if (name==_T("getErrorLog")) { retval = CefV8Value::CreateString(CefString(getErrorLog())); return true; } if (name==_T("loginByKey")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgloginByKey")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("loginByFile")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgloginByFile")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("setPassword")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgsetPassword")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("loginPassword")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgloginPassword")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("setServerLocation")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgsetServerLocation")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("saveAuthorization")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgsaveAuthorization")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("getDeviceEncoding")) { CString strDevice=CRsa::GetDevice(); wstring hash=L""; if (strDevice!=_T("")) hash=slnhelper::getstringhash(wstring(strDevice)); CString strRet; strRet.Format(_T("\"%s\""),hash.c_str()); retval = CefV8Value::CreateString(CefString(strRet)); return true; } if (name==_T("getUIPath")) { CString strRet=_T(""); if (GetUserDb()->GetUIPath()!=_T("")) strRet.Format(_T("\"%s\""),slnhelper::ReplaceToJson(GetUserDb()->GetUIPath())); else strRet.Format(_T("\"%s\""),slnhelper::ReplaceToJson(GetStaroneControl()->m_strUIPath)); retval= CefV8Value::CreateString(CefString(strRet)); return true; } if (name==_T("openLogFolder")) { ShellExecute(NULL,_T("open"),GetStaroneControl()->m_strUserConfig+_T("\\log"),NULL,NULL, SW_SHOW); return true; } if (name==_T("deleteBucket")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); CefRefPtr<CefV8Value> func=NULL; if (arguments.size()>1) func=arguments[1]; Handler_Msg *hmsg=new Handler_Msg; hmsg->strJson=strContent; hmsg->v8Ctx=CefV8Context::GetCurrentContext(); hmsg->vObject=object; hmsg->vFunc=func; CWebBaseDlg::m_HanderMsg.push_back(hmsg); CefRefPtr<CefBrowser> browser=CefV8Context::GetCurrentContext()->GetBrowser(); CefRefPtr<CefProcessMessage> msg=CefProcessMessage::Create(_T("msgdeleteBucket")); CefRefPtr<CefListValue>msglist=msg->GetArgumentList(); msglist->SetInt(0,(int)hmsg); browser->SendProcessMessage(PID_RENDERER,msg); } return true; } if (name==_T("setTransInfo")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); setTransInfo(strContent); } return true; } if (name==_T("getTransInfo")) { retval = CefV8Value::CreateString(CefString(getTransInfo())); return true; } if (name==_T("getCurrentLocation")) { CString strTemp=_T(""); if (GetStaroneControl()->m_UserInfo.strArea!=_T("")) { strTemp.Format(_T("\"%s\""),GetStaroneControl()->m_UserInfo.strArea); } retval = CefV8Value::CreateString(CefString(strTemp)); return true; } if (name==_T("getCurrentHost")) { CString strTemp=_T(""); if (GetStaroneControl()->m_UserInfo.strHost!=_T("")) { strTemp.Format(_T("\"%s\""),GetStaroneControl()->m_UserInfo.strHost); } retval = CefV8Value::CreateString(CefString(strTemp)); return true; } if (name==_T("stopLoadDownload")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); stopLoadDownload(strContent); } return true; } if (name==_T("openUrl")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); openUrl(strContent); } return true; } if (name==_T("setCallFunctionInfo")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); setCallFunctionInfo(strContent); } return true; } if (name==_T("getCallFunctionInfo")) { CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); retval = CefV8Value::CreateString(CefString(getCallFunctionInfo(strContent))); } return true; } if (name==_T("gGetLanguage")) { retval = CefV8Value::CreateString(CefString(gGetLanguage())); return true; } if (name==_T("gChangeLanguage")) { CString strContent=_T(""); if(arguments.size()>0&&arguments[0]->IsString()) strContent.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); gChangeLanguage(strContent); return true; } if (name==_T("gAccountAction")) { CString strCmd; CString strContent; if(arguments.size()>0&&arguments[0]->IsString()) { strCmd.Format(_T("%s"),arguments[0]->GetStringValue().c_str()); } if(arguments.size()>1&&arguments[1]->IsString()) { strContent.Format(_T("%s"),arguments[1]->GetStringValue().c_str()); } retval = CefV8Value::CreateString(CefString(gAccountAction(strCmd,strContent))); return true; } return false; }
wavc_t *cacheWaveDataV(int fromMemory, FILE *hmmio) { MPOS mp; wavc_t *ret; struct RIFFHEADER head; LPWAVEHDR lpWaveHdr; /* HMMIO hmmio; */ HANDLE hFormat; DWORD data, dwDataSize; HANDLE hData = NULL; // handle of waveform data memory HPSTR lpData = NULL; // pointer to waveform data memory size_t (*pread)(void *, size_t, size_t, FILE*) = fromMemory ? mread : fread; int (*pseek)(FILE *, long, int) = fromMemory ? mseek : fseek; if(!pread(&head, sizeof head, 1, hmmio) || memcmp(head.ckid, "RIFF", sizeof head.ckid) || memcmp(head.fccType, "WAVE", sizeof head.fccType) || memcmp(head.fmtType, "fmt ", sizeof head.fmtType) || head.channels != 1 || head.bitsPerSample != 8){ return NULL; } pseek(hmmio, 20 + head.chunkLength, SEEK_SET); do{ pread(&data, sizeof data, 1, hmmio); if(!memcmp(&data, "data", sizeof data)) break; pread(&dwDataSize, sizeof dwDataSize, 1, hmmio); pseek(hmmio, dwDataSize, SEEK_CUR); } while(1); // Allocate and lock memory for the waveform data. if(pread(&dwDataSize, sizeof dwDataSize, 1, hmmio) <= 0){ return NULL; } ret = malloc(sizeof(wavc_t) + dwDataSize); ret->format.wFormatTag = WAVE_FORMAT_PCM; ret->format.nChannels = head.channels; ret->format.nSamplesPerSec = head.samplesPerSec; ret->format.nAvgBytesPerSec = head.bytesPerSec; ret->format.nBlockAlign = head.channels * head.bitsPerSample / 8; ret->format.wBitsPerSample = head.bitsPerSample; ret->format.cbSize = 0; #if 1 lpData = (HPSTR)&ret[1]; #else hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, dwDataSize ); if (!hData) { MessageBox(NULL, "Out of memory.", NULL, MB_OK | MB_ICONEXCLAMATION); /* mmioClose(hmmio, 0); */ fclose(hmmio); return; } if ((lpData = GlobalLock(hData)) == NULL) { MessageBox(NULL, "Failed to lock memory for data chunk.", NULL, MB_OK | MB_ICONEXCLAMATION); GlobalFree(hData); /* mmioClose(hmmio, 0); */ fclose(hmmio); return; } #endif // Read the waveform data subchunk. if(pread(lpData, 1, dwDataSize, hmmio) != dwDataSize) { MessageBox(NULL, ferror(hmmio) ? "Failed to read data chunk. Error" :feof(hmmio) ? "Failed to read data chunk. EOF" : "Failed to read data chunk.", NULL, MB_OK | MB_ICONEXCLAMATION); /* GlobalUnlock(hData); GlobalFree(hData); */ /* mmioClose(hmmio, 0); */ free(ret); return NULL; } // Allocate and lock memory for the header. #if 1 lpWaveHdr = &ret->head; #else hWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, (DWORD) sizeof(WAVEHDR)); if (hWaveHdr == NULL) { GlobalUnlock(hData); GlobalFree(hData); MessageBox(NULL, "Not enough memory for header.", NULL, MB_OK | MB_ICONEXCLAMATION); fclose(hmmio); return; } lpWaveHdr = (LPWAVEHDR) GlobalLock(hWaveHdr); if (lpWaveHdr == NULL) { GlobalUnlock(hData); GlobalFree(hData); MessageBox(NULL, "Failed to lock memory for header.", NULL, MB_OK | MB_ICONEXCLAMATION); fclose(hmmio); return; } #endif // After allocation, set up and prepare header. lpWaveHdr->lpData = lpData; lpWaveHdr->dwBufferLength = dwDataSize; lpWaveHdr->dwFlags = 0L; lpWaveHdr->dwLoops = 0L; return ret; }
/*----------------------------------------------------------------------------- Initialize DirectSound -----------------------------------------------------------------------------*/ static BOOL d_init( Sint32 soundType, //Kitao追加。1…通常(ソフトバッファ&ミキシング。環境にもよるかもしれないがベストな音質)。2…ハードバッファ&ソフトミキシング(それなりにいい音が鳴る)。 HWND hWnd, WORD nChannels, WORD nSamplesPerSec, WORD wBitsPerSample, DWORD dwBufSize) // in bytes { int i;//Kitao追加 DSBUFFERDESC dsbd; WAVEFORMATEX waveFormat;//Kitao更新 // Create IDirectSound if (FAILED(DirectSoundCreate(NULL, &_pDS, NULL))) { MessageBox(WINMAIN_GetHwnd(), "ERROR: DIRECTSOUND::DirectSoundCreate() failed. ", "Ootake", MB_OK); //Kitao追加 return FALSE; } /* ** Set coop level to DSSCL_PRIORITY ** ** プライマリバッファのフォーマットを設定できるよう、プライマリ協調レベル ** を設定する。デフォルトのフォーマットに変更を加えない場合、入力の ** フォーマットにかかわりなく、出力は 8 ビット、22 kHz フォーマットになる。 ** IDirectSoundBuffer::SetFormat の呼び出しが失敗しても問題はない点に ** 注意する。DirectSound は単純に、利用できる中で最も近いフォーマットに ** 設定する。 */ if (FAILED(_pDS->SetCooperativeLevel(hWnd, DSSCL_PRIORITY))) { MessageBox(WINMAIN_GetHwnd(), "ERROR: DIRECTSOUND::SetCooperativeLevel() failed. ", "Ootake", MB_OK); //Kitao更新 return FALSE; } /* ** Get the primary buffer. ** ** プライマリバッファのフォーマットを設定するには、最初に ** DSBUFFERDESC 構造体でそのフォーマットを記述し、次にその記述を ** IDirectSound::CreateSoundBuffer メソッドに渡す。 */ ZeroMemory(&dsbd, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER; dsbd.dwBufferBytes = 0; dsbd.lpwfxFormat = NULL; if (FAILED(_pDS->CreateSoundBuffer(&dsbd, &_pDSBP, NULL))) //Kitao更新。v1.03。プライマリは作成した後すぐには開放しないようにした。 { MessageBox(WINMAIN_GetHwnd(), "ERROR: DIRECTSOUND::CreateSoundBuffer() failed. ", "Ootake", MB_OK); //Kitao更新 return FALSE; } /* ** Set primary buffer to desired format. ** ** プライマリバッファオブジェクトを取得した後で、希望のウェーブ ** フォーマットを記述し、その記述を IDirectSoundBuffer::SetFormat ** メソッドに渡す。 */ ZeroMemory(&waveFormat, sizeof(WAVEFORMATEX)); waveFormat.wFormatTag = WAVE_FORMAT_PCM; waveFormat.nChannels = nChannels; waveFormat.wBitsPerSample = wBitsPerSample; waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; waveFormat.nSamplesPerSec = nSamplesPerSec; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; if (FAILED(_pDSBP->SetFormat(&waveFormat))) { MessageBox(WINMAIN_GetHwnd(), "ERROR: DIRECTSOUNDBUFFER::SetFormat() failed. ", "Ootake", MB_OK); //Kitao更新 // return FALSE; } // DSBUFFERDESC 構造体を設定する。 ZeroMemory(&dsbd, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); switch (soundType) //Kitao更新。バッファ設定を選択できるようにした。v1.03。v1.31から2択に絞った。 { case 2: //Kitao更新。1の設定のほうがベストと思うが、バッファをDSBCAPS_STATICでハードメモリ上にしたら音は大人しいが音の解像度が上がる感じでこれも良し。 dsbd.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_GLOBALFOCUS | DSBCAPS_STATIC | DSBCAPS_LOCSOFTWARE; break; default: //=1 //Kitao更新。グローバルフォーカスにした。&ハードウェアミキシングだとノイズが入りやすいのでソフトミキシングに。PCエンジンの内蔵音源はこの設定が一番高音が心に響く感じ。 dsbd.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_GLOBALFOCUS | DSBCAPS_LOCSOFTWARE; break; } dsbd.dwBufferBytes = dwBufSize * AOUT_BUFFERRATE; //Kitao更新。AOUT_BUFFERRATE倍ぶん用意する。 dsbd.lpwfxFormat = &waveFormat; // セカンダリバッファを作成する Kitao更新。3chぶん作成。 if (FAILED(_pDS->CreateSoundBuffer(&dsbd, &_pDSB1, NULL))) { MessageBox(WINMAIN_GetHwnd(), "ERROR: AudioOut: Failed creating secondary buffer1. ", "Ootake", MB_OK); //Kitao更新 return FALSE; } if (FAILED(_pDS->CreateSoundBuffer(&dsbd, &_pDSB2, NULL))) { MessageBox(WINMAIN_GetHwnd(), "ERROR: AudioOut: Failed creating secondary buffer2. ", "Ootake", MB_OK); //Kitao更新 return FALSE; } if (FAILED(_pDS->CreateSoundBuffer(&dsbd, &_pDSB3, NULL))) { MessageBox(WINMAIN_GetHwnd(), "ERROR: AudioOut: Failed creating secondary buffer3. ", "Ootake", MB_OK); //Kitao更新 return FALSE; } //Kitao更新。3chぶん用意。[0]をstop notificationとし、[1]〜[AOUT_BUFFERRATE]までを分岐点イベントとした。 for (i =0; i<=AOUT_BUFFERRATE; i++) { _hEvent1[i] = CreateEvent(NULL, FALSE, FALSE, NULL); //v2.36更新。自動リセットするようにした。 _hEvent2[i] = CreateEvent(NULL, FALSE, FALSE, NULL); _hEvent3[i] = CreateEvent(NULL, FALSE, FALSE, NULL); } // DIRECTSOUNDNOTIFY のインタフェイスを得る if (FAILED(_pDSB1->QueryInterface(IID_IDirectSoundNotify, (void**)&_LpDSN1))) return FALSE; if (FAILED(_pDSB2->QueryInterface(IID_IDirectSoundNotify, (void**)&_LpDSN2))) return FALSE; if (FAILED(_pDSB3->QueryInterface(IID_IDirectSoundNotify, (void**)&_LpDSN3))) return FALSE; // Kitao更新。再生が停止されたときの[0]で処理することにして、[1]〜[AOUT_BUFFERRATE]ぶんまでを音の分岐点通知用とした。 // 再生が停止されたときの notification 用 _PosNotify1[0].dwOffset = DSBPN_OFFSETSTOP; _PosNotify1[0].hEventNotify = _hEvent1[0]; _PosNotify2[0].dwOffset = DSBPN_OFFSETSTOP; _PosNotify2[0].hEventNotify = _hEvent2[0]; _PosNotify3[0].dwOffset = DSBPN_OFFSETSTOP; _PosNotify3[0].hEventNotify = _hEvent3[0]; // Kitao更新。バッファの分岐点(先頭含む)通知用 for (i = 1; i<=AOUT_BUFFERRATE; i++) { //_PosNotify1[i].dwOffset = (i-1)*dwBufSize; //v2.36更新。各バッファの切れ目よりも手前(半分の位置)でイベントを起こすようにした。反応が遅いドライバでもこれなら確実で、半分の位置なら早すぎる心配もないようだ。 if (i == 1) { _PosNotify1[i].dwOffset = AOUT_BUFFERRATE*dwBufSize - dwBufSize/2; _PosNotify2[i].dwOffset = AOUT_BUFFERRATE*dwBufSize - dwBufSize/2; _PosNotify3[i].dwOffset = AOUT_BUFFERRATE*dwBufSize - dwBufSize/2; } else { _PosNotify1[i].dwOffset = (i-1)*dwBufSize - dwBufSize/2; _PosNotify2[i].dwOffset = (i-1)*dwBufSize - dwBufSize/2; _PosNotify3[i].dwOffset = (i-1)*dwBufSize - dwBufSize/2; } _PosNotify1[i].hEventNotify = _hEvent1[i]; _PosNotify2[i].hEventNotify = _hEvent2[i]; _PosNotify3[i].hEventNotify = _hEvent3[i]; } // notification を設定する if (FAILED(_LpDSN1->SetNotificationPositions(AOUT_BUFFERRATE+1, _PosNotify1))) return FALSE; if (FAILED(_LpDSN2->SetNotificationPositions(AOUT_BUFFERRATE+1, _PosNotify2))) return FALSE; if (FAILED(_LpDSN3->SetNotificationPositions(AOUT_BUFFERRATE+1, _PosNotify3))) return FALSE; // オーディオバッファを確保する _pAudioBuf1 = (Sint16*)GlobalAlloc(GMEM_FIXED, dwBufSize); _pAudioBuf2 = (Sint16*)GlobalAlloc(GMEM_FIXED, dwBufSize); _pAudioBuf3 = (Sint16*)GlobalAlloc(GMEM_FIXED, dwBufSize); _pAudioBuf0 = (Sint16*)GlobalAlloc(GMEM_FIXED, dwBufSize); if (_pAudioBuf1 == NULL) { d_deinit(); return FALSE; } //Kitao更新。高速化のため、メモリのロックは最初に1度だけ行うようにした。v1.02 _dwBufSize = dwBufSize; _bPlay = FALSE; //スレッドを開始する前にオーディオ初期化完了フラグをたてる。 //[2004.04.28] fixed _bAudioInit = TRUE; //スレッドを作成し実行する _bThreadEnd = FALSE; _hThread = CreateThread(NULL, 0, playback_thread, NULL, 0, &_dwThreadID); if (_hThread == NULL) { d_deinit(); _bAudioInit = FALSE; return FALSE; } //スレッドの優先順位を上げる。v2.36追加。効果が無かったためカット //OpenThread(THREAD_SET_INFORMATION, TRUE, _dwThreadID); //if (SetThreadPriority(_hThread, THREAD_PRIORITY_HIGHEST) == NULL) // return FALSE; return TRUE; }
static void playWave(wavc_t *wc, HWND hwndApp){ HWAVEOUT hWaveOut; HGLOBAL hWaveHdr; LPWAVEHDR lpWaveHdr; UINT wResult; // Open a waveform device for output using window callback. if (waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER, &wc->format, (LONG)hwndApp, 0L, CALLBACK_WINDOW)) /* if (waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER, pFormat, (LONG)waveSoundStopper, 0L, CALLBACK_FUNCTION)) */ { MessageBox(NULL, "Failed to open waveform output device.", NULL, MB_OK | MB_ICONEXCLAMATION); /* LocalUnlock(hFormat); LocalFree(hFormat); mmioClose(hmmio, 0); */ return; } hWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, (DWORD) sizeof(WAVEHDR)); if (hWaveHdr == NULL) { MessageBox(NULL, "Not enough memory for header.", NULL, MB_OK | MB_ICONEXCLAMATION); return; } lpWaveHdr = (LPWAVEHDR) GlobalLock(hWaveHdr); if (lpWaveHdr == NULL) { MessageBox(NULL, "Failed to lock memory for header.", NULL, MB_OK | MB_ICONEXCLAMATION); return; } memcpy(lpWaveHdr, &wc->head, sizeof(WAVEHDR)); lpWaveHdr->dwUser = (DWORD)hWaveHdr; waveOutPrepareHeader(hWaveOut, lpWaveHdr, sizeof(WAVEHDR)); // Now the data block can be sent to the output device. The // waveOutWrite function returns immediately and waveform // data is sent to the output device in the background. /* waveOutSetVolume(hWaveOut, UINT_MAX);*/ wResult = waveOutWrite(hWaveOut, lpWaveHdr, sizeof(WAVEHDR)); if (wResult != 0) { waveOutUnprepareHeader(hWaveOut, lpWaveHdr, sizeof(WAVEHDR)); GlobalUnlock(hWaveHdr); GlobalFree(hWaveHdr); /* GlobalUnlock( hData); GlobalFree(hData); */ MessageBox(NULL, "Failed to write block to device", NULL, MB_OK | MB_ICONEXCLAMATION); return; } }
bool CAudioWave::Init( void ) { WAVEFORMATEX format; int i, bufferSize; HRESULT hr; m_buffersSent = 0; m_buffersCompleted = 0; m_pauseCount = 0; memset (&format, 0, sizeof(format)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = DeviceChannels(); format.wBitsPerSample = DeviceSampleBits(); format.nSamplesPerSec = DeviceDmaSpeed(); format.nBlockAlign = format.nChannels *format.wBitsPerSample / 8; format.cbSize = 0; format.nAvgBytesPerSec = format.nSamplesPerSec *format.nBlockAlign; /* Open a waveform device for output using window callback. */ while ((hr = waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER, &format, 0, 0L, CALLBACK_NULL)) != MMSYSERR_NOERROR) { if (hr != MMSYSERR_ALLOCATED) { DevMsg ("waveOutOpen failed\n"); return false; } if (MessageBox (NULL, "The sound hardware is in use by another app.\n\n" "Select Retry to try to start sound again or Cancel to run Half-Life with no sound.", "Sound not available", MB_RETRYCANCEL | MB_SETFOREGROUND | MB_ICONEXCLAMATION) != IDRETRY) { g_pSoundServices->ConSafePrint ("waveOutOpen failure;\n" " hardware already in use\n"); return false; } } /* * Allocate and lock memory for the waveform data. The memory * for waveform data must be globally allocated with * GMEM_MOVEABLE and GMEM_SHARE flags. */ bufferSize = WAV_BUFFERS*WAV_BUFFER_SIZE; hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, bufferSize); if (!hData) { g_pSoundServices->ConSafePrint ("Sound: Out of memory.\n"); Shutdown(); return false; } lpData = (char *)GlobalLock(hData); if (!lpData) { g_pSoundServices->ConSafePrint ("Sound: Failed to lock.\n"); Shutdown(); return false; } memset (lpData, 0, bufferSize); /* * Allocate and lock memory for the header. This memory must * also be globally allocated with GMEM_MOVEABLE and * GMEM_SHARE flags. */ hWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, (DWORD) sizeof(WAVEHDR) * WAV_BUFFERS); if (hWaveHdr == NULL) { g_pSoundServices->ConSafePrint ("Sound: Failed to Alloc header.\n"); Shutdown(); return false; } lpWaveHdr = (LPWAVEHDR) GlobalLock(hWaveHdr); if (lpWaveHdr == NULL) { g_pSoundServices->ConSafePrint ("Sound: Failed to lock header.\n"); Shutdown(); return false; } memset (lpWaveHdr, 0, sizeof(WAVEHDR) * WAV_BUFFERS); /* After allocation, set up and prepare headers. */ for (i=0 ; i<WAV_BUFFERS ; i++) { lpWaveHdr[i].dwBufferLength = WAV_BUFFER_SIZE; lpWaveHdr[i].lpData = lpData + i*WAV_BUFFER_SIZE; if (waveOutPrepareHeader(hWaveOut, lpWaveHdr+i, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) { g_pSoundServices->ConSafePrint ("Sound: failed to prepare wave headers\n"); Shutdown(); return false; } } m_deviceSampleCount = bufferSize/(DeviceSampleBytes()); m_pBuffer = (void *)lpData; if (snd_firsttime) DevMsg ("Wave sound initialized\n"); return true; }
// Opens and decodes bitmap. Returns 0 on success and -1 on error. int Decodebitmap(char *path) { int i,size; char s[TEXTLEN+MAXPATH],fil[MAXFILE],ext[MAXEXT]; uchar *data,buf[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)]; FILE *f; BITMAPFILEHEADER *pbfh; BITMAPINFOHEADER *pbih; HCURSOR prevcursor; // Ask for file name. if (path==NULL || path[0]=='\0') { if (Selectinbmp()!=0) return -1; } else { strncpy(inbmp,path,sizeof(inbmp)); inbmp[sizeof(inbmp)-1]='\0'; }; fnsplit(inbmp,NULL,NULL,fil,ext); sprintf(s,"Reading %s%s...",fil,ext); Message(s,0); Updatebuttons(); // Open file and verify that this is the valid bitmap of known type. f=fopen(inbmp,"rb"); if (f==NULL) { // Unable to open file sprintf(s,"Unable to open %s%s",fil,ext); Reporterror(s); return -1; }; // Reading 100-MB bitmap may take many seconds. Let's inform user by changing // mouse pointer. prevcursor=SetCursor(LoadCursor(NULL,IDC_WAIT)); i=fread(buf,1,sizeof(buf),f); SetCursor(prevcursor); if (i!=sizeof(buf)) { // Unable to read file sprintf(s,"Unable to read %s%s",fil,ext); Reporterror(s); fclose(f); return -1; }; pbfh=(BITMAPFILEHEADER *)buf; pbih=(BITMAPINFOHEADER *)(buf+sizeof(BITMAPFILEHEADER)); if (pbfh->bfType!='BM' || pbih->biSize!=sizeof(BITMAPINFOHEADER) || pbih->biPlanes!=1 || (pbih->biBitCount!=8 && pbih->biBitCount!=24) || (pbih->biBitCount==24 && pbih->biClrUsed!=0) || pbih->biCompression!=BI_RGB || pbih->biWidth<128 || pbih->biWidth>32768 || pbih->biHeight<128 || pbih->biHeight>32768 ) { // Invalid bitmap type sprintf(s,"Unsupported bitmap type: %s%s",fil,ext); Reporterror(s); fclose(f); return -1; }; // Allocate buffer and read file. fseek(f,0,SEEK_END); size=ftell(f)-sizeof(BITMAPFILEHEADER); data=(uchar *)GlobalAlloc(GMEM_FIXED,size); if (data==NULL) { // Unable to allocate memory Reporterror("Low memory"); fclose(f); return -1; }; fseek(f,sizeof(BITMAPFILEHEADER),SEEK_SET); i=fread(data,1,size,f); fclose(f); if (i!=size) { // Unable to read bitmap sprintf(s,"Unable to read %s%s",fil,ext); Reporterror(s); GlobalFree((HGLOBAL)data); return -1; }; // Process bitmap. ProcessDIB((HGLOBAL)data,pbfh->bfOffBits-sizeof(BITMAPFILEHEADER)); GlobalFree((HGLOBAL)data); return 0; };
unsigned int __stdcall CreateBrokerThreadEntry(void *data) { TRY_CATCH CoInitialize(0); SBrokerThreadEntryData* inData = reinterpret_cast<SBrokerThreadEntryData*>(data); SStartBroker *startBroker = reinterpret_cast<SStartBroker*>(inData->buf); if (NULL == startBroker->buf || 0 == startBroker->bufSize) throw MCException("NULL == startBroker->buf || 0 == startBroker->bufSize"); CComPtr<IDispatch> broker; HRESULT hr; if((hr=broker.CoCreateInstance(L"Broker.CoBroker",NULL,CLSCTX_LOCAL_SERVER))!=S_OK) throw CExceptionBase(__LINE__,_T(__FILE__),_T(__DATE__),tstring(_T("CoBroker creation failed")),hr); CScopedTracker<HGLOBAL> globalMem; globalMem.reset(GlobalAlloc(GMEM_MOVEABLE, startBroker->bufSize), GlobalFree); if (NULL == globalMem) throw MCException_Win("Failed to GlobalAlloc"); CComPtr<IStream> stream; hr = CreateStreamOnHGlobal(globalMem, FALSE, &stream); if (S_OK != hr) throw MCException_Win(Format(_T("Failed to GlobalAlloc; result = %X"),hr)); ULARGE_INTEGER size; size.QuadPart = startBroker->bufSize; hr = stream->SetSize(size); if (S_OK != hr) throw MCException_Win(Format(_T("Failed to stream->SetSize; result = %X"),hr)); hr = CoMarshalInterface(stream, IID_IDispatch, broker, MSHCTX_LOCAL, NULL, MSHLFLAGS_NORMAL); if (S_OK != hr) throw MCException_Win(Format(_T("Failed to CoMarshalInterface; result = %X"),hr)); ULARGE_INTEGER uLi; LARGE_INTEGER li; li.QuadPart = 0; /// Writing stream to client process memory stream->Seek(li, STREAM_SEEK_SET, NULL); boost::scoped_array<char> localBuf; ULONG readCount; localBuf.reset(new char[startBroker->bufSize]); hr = stream->Read(localBuf.get(), startBroker->bufSize, &readCount); if (S_OK != hr) throw MCException_Win(Format(_T("stream->Read; result = %X"),hr)); /// Writing stream date into client process memory ULONG writtenCount; if (FALSE == WriteProcessMemory(inData->clientProcess, startBroker->buf, localBuf.get(), readCount, &writtenCount)) throw MCException_Win("Failed to WriteProcessMemory "); CoUninitialize(); Log.Add(_MESSAGE_,_T("Broker created and marshaled to BrokerProxy process")); return TRUE; CATCH_LOG() CoUninitialize(); return FALSE; }
// Processes data from the scanner. int ProcessDIB(HGLOBAL hdata,int offset) { int i,j,sizex,sizey,ncolor; uchar scale[256],*data,*pdata,*pbits; BITMAPINFO *pdib; pdib=(BITMAPINFO *)GlobalLock(hdata); if (pdib==NULL) return -1; // Something is wrong with this DIB // Check that bitmap is more or less valid. if (pdib->bmiHeader.biSize!=sizeof(BITMAPINFOHEADER) || pdib->bmiHeader.biPlanes!=1 || (pdib->bmiHeader.biBitCount!=8 && pdib->bmiHeader.biBitCount!=24) || (pdib->bmiHeader.biBitCount==24 && pdib->bmiHeader.biClrUsed!=0) || pdib->bmiHeader.biCompression!=BI_RGB || pdib->bmiHeader.biWidth<128 || pdib->bmiHeader.biWidth>32768 || pdib->bmiHeader.biHeight<128 || pdib->bmiHeader.biHeight>32768 ) { GlobalUnlock(hdata); return -1; }; // Not a known bitmap! sizex=pdib->bmiHeader.biWidth; sizey=pdib->bmiHeader.biHeight; ncolor=pdib->bmiHeader.biClrUsed; // Convert bitmap to 8-bit grayscale. Note that scan lines are DWORD-aligned. data=(uchar *)GlobalAlloc(GMEM_FIXED,sizex*sizey); if (data==NULL) { GlobalUnlock(hdata); return -1; }; if (pdib->bmiHeader.biBitCount==8) { // 8-bit bitmap with palette. if (ncolor>0) { for (i=0; i<ncolor; i++) { scale[i]=(uchar)((pdib->bmiColors[i].rgbBlue+ pdib->bmiColors[i].rgbGreen+pdib->bmiColors[i].rgbRed)/3); }; } else { for (i=0; i<256; i++) scale[i]=(uchar)i; }; if (offset==0) offset=sizeof(BITMAPINFOHEADER)+ncolor*sizeof(RGBQUAD); pdata=data; for (j=0; j<sizey; j++) { offset=(offset+3) & 0xFFFFFFFC; pbits=((uchar *)(pdib))+offset; for (i=0; i<sizex; i++) { *pdata++=scale[*pbits++]; }; offset+=sizex; }; } else { // 24-bit bitmap without palette. if (offset==0) offset=sizeof(BITMAPINFOHEADER)+ncolor*sizeof(RGBQUAD); pdata=data; for (j=0; j<sizey; j++) { offset=(offset+3) & 0xFFFFFFFC; pbits=((uchar *)(pdib))+offset; for (i=0; i<sizex; i++) { *pdata++=(uchar)((pbits[0]+pbits[1]+pbits[2])/3); pbits+=3; }; offset+=sizex*3; }; }; // Decode bitmap. This is what we are for here. Startbitmapdecoding(&procdata,data,sizex,sizey); // Free original bitmap and report success. GlobalUnlock(hdata); return 0; };
HRESULT CColorSpectrum::OnDraw(ATL_DRAWINFO& di) { CRect& rc = *(CRect*)di.prcBounds; HDC hDC = di.hdcDraw; if (m_bEnabled) { #define ROWBYTES(width,bitcount) ((((width)*(bitcount)+31) >> 3) & 0xfffc) int width = rc.Width()-20; int height = rc.Height(); FillSolidRect(hDC, rc.left+width, rc.top, 20, height/2, RGB(255, 255, 255)); FillSolidRect(hDC, rc.left+width, rc.top+height/2, 20, rc.Height()-height/2, RGB(0, 0, 0)); int bytesPerRow = ROWBYTES(width, 24); BITMAPINFOHEADER bmi; ZeroMemory(&bmi, sizeof(bmi)); bmi.biSize = sizeof(BITMAPINFOHEADER); bmi.biWidth = width; bmi.biHeight = height; bmi.biPlanes = 1; bmi.biBitCount = 24; bmi.biCompression = BI_RGB; bmi.biSizeImage = bytesPerRow*height; LPBYTE bits = (LPBYTE)GlobalAlloc(0, bmi.biSizeImage); if (bits) { for (int y = 0; y < height; y++) { RGBTRIPLE* dest = (RGBTRIPLE*)(bits + (height-y-1)*bytesPerRow); for (int x = 0; x < width; x++) { int h = (x * 255)/width; int l = ((height-y-1) * 255)/height; int s = ((height-y-1) * 255)/height; //int s = 127;//(x * width)/255; COLORREF clr = HLStoRGB(HLS(h, l, s)); dest->rgbtRed = GetRValue(clr); dest->rgbtGreen = GetGValue(clr); dest->rgbtBlue = GetBValue(clr); dest++; } } SetDIBitsToDevice(hDC, rc.left, rc.top, width, height, 0, 0, 0, height, bits, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS); GlobalFree(bits); } } return S_OK; }
WINGDIAPI BOOL GLAPIENTRY wglUseFontBitmapsA(HDC hdc, DWORD first, DWORD count, DWORD listBase) { int i; GLuint font_list; DWORD size; GLYPHMETRICS gm; HANDLE hBits; LPSTR lpBits; MAT2 mat; int success = TRUE; if (count == 0) return FALSE; font_list = listBase; mat.eM11 = FixedFromDouble(1); mat.eM12 = FixedFromDouble(0); mat.eM21 = FixedFromDouble(0); mat.eM22 = FixedFromDouble(-1); memset(&gm,0,sizeof(gm)); /* ** If we can't get the glyph outline, it may be because this is a fixed ** font. Try processing it that way. */ if( GetGlyphOutline(hdc, first, GGO_BITMAP, &gm, 0, NULL, &mat) == GDI_ERROR ) { return wglUseFontBitmaps_FX( hdc, first, count, listBase ); } /* ** Otherwise process all desired characters. */ for (i = 0; i < (int)count; i++) { DWORD err; glNewList( font_list+i, GL_COMPILE ); /* allocate space for the bitmap/outline */ size = GetGlyphOutline(hdc, first + i, GGO_BITMAP, &gm, 0, NULL, &mat); if (size == GDI_ERROR) { glEndList( ); err = GetLastError(); success = FALSE; continue; } hBits = GlobalAlloc(GHND, size+1); lpBits = GlobalLock(hBits); err = GetGlyphOutline(hdc, /* handle to device context */ first + i, /* character to query */ GGO_BITMAP, /* format of data to return */ &gm, /* ptr to structure for metrics*/ size, /* size of buffer for data */ lpBits, /* pointer to buffer for data */ &mat /* pointer to transformation */ /* matrix structure */ ); if (err == GDI_ERROR) { GlobalUnlock(hBits); GlobalFree(hBits); glEndList( ); err = GetLastError(); success = FALSE; continue; } glBitmap(gm.gmBlackBoxX,gm.gmBlackBoxY, (GLfloat)-gm.gmptGlyphOrigin.x, (GLfloat)gm.gmptGlyphOrigin.y, (GLfloat)gm.gmCellIncX, (GLfloat)gm.gmCellIncY, (const GLubyte * )lpBits); GlobalUnlock(hBits); GlobalFree(hBits); glEndList( ); } return success; }