HRESULT STDMETHODCALLTYPE TinySmiley::SaveAs(LPSTREAM pStm)//默认保存第一帧到文件流 { if (!pStm) return S_FALSE; if (m_images.size() == 0) return S_FALSE; BITMAP bitmap = { 0 }; if (!GetObject(m_images[0], sizeof(BITMAP), (LPSTR)&bitmap)) return S_FALSE; BITMAPINFOHEADER bi = { 0 }; bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bitmap.bmWidth; bi.biHeight = bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = bitmap.bmBitsPixel; bi.biCompression = BI_RGB; DWORD size = bitmap.bmWidthBytes * bitmap.bmHeight; BITMAPFILEHEADER bfh = { 0 }; bfh.bfType = 0x4d42; bfh.bfOffBits = min(14, sizeof(BITMAPFILEHEADER)) + sizeof(BITMAPINFOHEADER) + bi.biClrUsed * sizeof(RGBQUAD); bfh.bfSize = bfh.bfOffBits + bitmap.bmWidthBytes*bitmap.bmHeight; ULARGE_INTEGER libSize; libSize.LowPart = bfh.bfSize; pStm->SetSize(libSize); ULONG cbWritten = 0; pStm->Write(&bfh, min(14, sizeof(BITMAPFILEHEADER)), &cbWritten); pStm->Write(&bi, bi.biSize, &cbWritten); pStm->Write(bitmap.bmBits, bitmap.bmWidthBytes*bitmap.bmHeight, &cbWritten); return S_OK; }
STDMETHODIMP CZ80Assembler::Assemble(VARIANT varInput, int *lpInt) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, output_buf_size); output_contents = (unsigned char *) GlobalLock(hGlobal); if (V_VT(&varInput) == VT_BSTR) { mode = MODE_NORMAL | MODE_COMMANDLINE; CW2CT szInput(V_BSTR(&varInput)); input_contents = strdup(szInput); } else { mode = MODE_NORMAL; if (curr_input_file) { free(curr_input_file); } curr_input_file = strdup(m_bstrInputFile); if (output_filename) { free(output_filename); } output_filename = strdup(m_bstrOutputFile); } *lpInt = run_assembly(); GlobalUnlock(hGlobal); if (m_pStmOutput != NULL) { m_pStmOutput->Release(); } LPSTREAM pStream = NULL; HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pStream); ULARGE_INTEGER ul; ul.QuadPart = out_ptr - output_contents; pStream->SetSize(ul); m_pStmOutput = pStream; return S_OK; }