VC雕虫小技集(四)

原文: VC雕虫小技集(四)
 

VC雕虫小技集()

何志丹

1, 阅读程序常常要看此变量在那些地方值改变过

ctrl+f查找太麻烦

将此变量前加const

改变的地方报错

 :office" />

2, 看一个函数被那些函数调用.

方法:

1,调试状态下,view->debug window->call Stack

2,class view 的快捷菜单中选择called by

 

3, 在状态栏的最左边显示时间

static UINT indicators[] =

{

        ID_SEPARATOR,//我们增加的

       ID_SEPARATOR,          

       ID_INDICATOR_CAPS,

       ID_INDICATOR_NUM,

       ID_INDICATOR_SCRL,

};

 

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

      .....       m_wndStatusBar.SetPaneInfo(1,ID_SEPARTOR,SBPS_NORMAL,60);

}

 

//菜单的响应函数

void CMainFrame::OnTest()

{

    CTime t;

       t = CTime::GetCurrentTime();

       CString str = t.Format("%H - %M  -%S");

       m_wndStatusBar.SetPaneText(0,str);

 

}

 

4,模拟鼠标

::SetCursorPos((int)ptMouse->x,(int)ptMouse->y);

::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);    

::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);   

::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);

::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

 

5,什么是WORD, DWORD

 typedef unsigned short WORD

 typedef unsigned long  DWORD

 

6,移动控件

 CWnd * pWnd = GetDlgItem(IDC_BUTTON1);

       CRect r;

       pWnd->GetWindowRect(&r);

       r.left +=50;

       r.right += 50;

       pWnd->MoveWindow(r);

 

7, 如何让对话框中的CEdit响应ENTER键回车

GetDlgItem(IDC_EDIT1)->SetWindowText("111/r/n22");

右键属性

sytle -> Multiline选上

最好把want return 也选上

 

8,c语言转化为汇编

VC++ provides this feature.

Project->Settings...

C/C++ tab

Category: Choose Listing Files

Listing file type:

select "Assembly with source code"

 

9,如何获得进程所消耗的CPU时间?

BOOL GetProcessTimes(

  HANDLE hProcess,

  LPFILETIME lpCreationTime,

  LPFILETIME lpExitTime,

  LPFILETIME lpKernelTime,

  LPFILETIME lpUserTime

);

 

10,如何通过扩展名得到该扩展名所对应的图标?

SHGetFileInfo(path,

              attr,

              &sfi,

              sizeof(SHFILEINFO),

              SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_TYPENAME);

 

 

 

如何在拉着对话框的边框改变大小时,让它成比例的变化.就像视频播放软件哪样

处理wm_sizing消息

void CTest 1Dlg::OnSizing(UINT fwSide, LPRECT pRect)

{

  CDialog::OnSizing(fwSide, pRect);

  if((fwSide==WMSZ_BOTTOM) || (fwSide==WMSZ_TOP))

    pRect->right=pRect->left+(pRect->bottom-pRect->top)*2; 

  else

    pRect->bottom=pRect->top+(pRect->right-pRect->left)*0.5; 

}



CNBIE BLOG

VC调试技术小技巧(2)

原文: VC调试技术小技巧(2)
 
#ifndef XTIB_H
#define XTIB_H
// Call SetThreadName(), and then paste this expression into the watch window:
//    (char*)(DW(@TIB+0x14))
 
#pragma pack(1)
 
typedef struct _EXCEPTION_REGISTRATION_RECORD
{
         struct _EXCEPTION_REGISTRATION_RECORD * pNext;
         FARPROC                                                                         pfnHandler;
} EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;
 
typedef struct tagXTIB
{
         PEXCEPTION_REGISTRATION_RECORD pvExcept; // 00h Head of exception record list
         PVOID      pvStackUserTop;                        // 04h Top of user stack
         PVOID      pvStackUserBase;                       // 08h Base of user stack
 
         union                                                                          // 0Ch (NT/Win95 differences)
         {
                   struct                                                                // Win95 fields
                   {
                            WORD      pvTDB;                                // 0Ch TDB
                            WORD      pvThunkSS;                        // 0Eh SS selector used for thunking to 16 bits
                            DWORD   unknown1;                           // 10h
                   } WIN95;
 
                   struct        // WinNT fields
                   {
                            PVOID SubSystemTib;              // 0Ch
                            ULONG FiberData;                      // 10h
                   } WINNT;
         } TIB_UNION1;
 
         PVOID      pvArbitrary;                                  // 14h Available for application use
         struct _tib *ptibSelf;                             // 18h Linear address of TIB structure
 
         union                                                                          // 1Ch (NT/Win95 differences)
         {
                   struct        // Win95 fields
                   {
                            WORD      TIBFlags;                    // 1Ch
                            WORD      Win16MutexCount;  // 1Eh
                            DWORD   DebugContext;          // 20h
                            DWORD   pCurrentPriority;       // 24h
                            DWORD   pvQueue;                    // 28h Message Queue selector
                   } WIN95;
 
                   struct        // WinNT fields
                   {
                            DWORD unknown1;                           // 1Ch
                            DWORD processID;                   // 20h
                            DWORD threadID;                     // 24h
                            DWORD unknown2;                           // 28h
                   } WINNT;
         } TIB_UNION2;
 
         PVOID*    pvTLSArray;                               // 2Ch Thread Local Storage array
 
         union                                                                          // 30h (NT/Win95 differences)
         {
                   struct        // Win95 fields
                   {
                            PVOID*    pProcess;                    // 30h Pointer to owning process database
                   } WIN95;
         } TIB_UNION3;
 
 
         // Internal function to get the TIB
         /*----------------------------------------------------------------------
         FUNCTION    :   GetTIB
 
         DEs criptION :   Returns pointer to TIB for current thread.
 
         PARAMETERS  :   None.
 
         RETURNS     :   NULL  - A really bad thing
                    !NULL - Pointer to TIB for current thread
         ----------------------------------------------------------------------*/
         static tagXTIB * GetTIB()
         {
                   tagXTIB * pTib;
 
                   __asm
                   {
                            MOV  EAX , FS:[18h]
                            MOV  pTib , EAX
                   }
                   return pTib;
         }
 
         /*----------------------------------------------------------------------
         FUNCTION    :   SetThreadName
 
DEs criptION :   SetThreadName provides a way to "name" your threads so that you can
                    see at a glance which thread is active when you are in the debugger.
                    Calling SetThreadName sets the string pointer parameter into the Thread
                    Information Block (TIB) pvArbitrary field (offset 0x14).  Matt Pietrek
                    discussed the TIB structure in his May 1996 "Under the Hood" column.
                    I included Matt's TIB.h as part of this project if you want to see the
                    rest of the fields in the TIB.
                    pvArbitrary is an unused spot in the TIB that applications can use
                    as they wish.  SetThreadName does the right thing and checks if the
                    pvArbitrary is not 0 and will not write the string pointer to avoid
                    tromping on any other data written there.
                    To view which thread is active in the Watch window, use
                    "(char*)(DW(@TIB+0x14))"  As you swap threads, you can now tell at a
                    glance which thread you are in!
 
         PARAMETERS  :   szName - A pointer to the string which you would like to name the
                    current thread.  You should make the string pointer a
                    constant name.
 
         RETURNS     :   TRUE  - The thread name was set.
                    FALSE - Something else overwrote the pvArbitrary field.
         ----------------------------------------------------------------------*/
         static BOOL SetThreadName(LPCTSTR szName)
         {
                   // Grab the TIB.
                   tagXTIB * pTib = GetTIB();
 
                   // If someone has already written to the arbitrary field, I don't
                   // want to be overwriting it.
                   if (pTib->pvArbitrary != NULL)
                            return FALSE;
 
                   // Nothing's there.  Set the name.
                   pTib->pvArbitrary = (void*)szName;
 
                   return TRUE;
         }
 
         /*----------------------------------------------------------------------
         FUNCTION    :   GetThreadName
 
         DEs criptION :   Returns the string pointer to the name assigned to the
                    current thread.
 
         PARAMETERS  :   None.
 
         RETURNS     :   NULL  - No name was assigned.
                    !NULL - The value at the TIB pvArbitrary offset.  Please
                    note that the pointer could be invalid of if something
                    other than SetThreadName used the pvArbitrary offset.
         ----------------------------------------------------------------------*/
         static LPCTSTR GetThreadName()
         {
                   // Grab the TIB.
                   tagXTIB * pTib = GetTIB();
 
                   return (LPCTSTR)pTib->pvArbitrary;
         }
 
 
} XTIB;
 
#pragma pack()
 
#endif //XTIB_H




CNBIE BLOG

vc调试经验

原文: vc调试经验
 

       最经常在csdn上看到关于调试方面的文章,人气值也挺旺,可是要消化那一大堆文字确实也是不容易的事。在这里,我也来写一段!希望对大家有所帮助。

       我们在做vc编程调试时经常遇到需要显示变量的内容之类的问题,在dos模式下我们简单使用printf(...)就行了,在windows我们如何显示变量内容呢?大家肯定有许多方法如:调试时设置断点,用MessagBox什么的。我在开始使用vc时,也经常采用这样的方法来调试,但遇到一些不能用断点调试的程序时,比如某些绘图的程序里需要在ondraw里计算,就没办法了,把变量写到文件里吧?太麻烦了,还是看看仔细检查源代码吧!

        一个偶然的机会,我终于发现了windows下类似printf的东东了,那就是_RPT。

        大家在自己vc 的源程序里加上_RPT1(0,"i=%d/n",i);到debug模式下运行一下。好了,看到结果了吧!那_RPT1能有几个参数吗?不行!哪要有两个参数怎么办?那就用_RPT2吧!其他的就自己试吧!

        s6283@hotmail.com





CNBIE BLOG

VC调用ACM音频压缩编程接口的方法

原文: VC调用ACM音频压缩编程接口的方法
 

音 频 和 视 频 数 据 是 大 多 数 多 媒 体 应 用 程 序 向 用 户 提 供 信 息 的 主 要 方 式, 这 些 数 据 一 般 具 有较 高 的 采 样 速 率, 如 果 不 经 过 压 缩 的 话, 保 存 它 们 需 要 消 耗 大 量 的 存 贮 空 间, 在 网 络 上 进 行 传 输的 效 率 也 很 低, 因 此 音 频 视 频 数 字 压 缩 编 码 在 多 媒 体 技 术 中 占 有 很 重 要 的 地 位。 就 音 频 数 据 而言, 目 前 常 用 的 压 缩 方 法 有 很 多 种, 不 同 的 方 法 具 有 不 同 的 压 缩 比 和 还 原 音 质, 编 码 的 格 式 和 算法 也 各 不 相 同, 其 中 某 些 压 缩 算 法 相 当 复 杂, 普 通 程 序 不 可 能 去 实 现 其 编 解 码 算 法。 所 幸 的 是,与Windows 3.x 相 比,Windows 95/NT 4.0 为 多 媒 体 应 用 程 序 提 供 了 更 强 的支 持, 引 入 了ACM(Audio Compression Manager, 音 频 压 缩 管 理 器) 和VCM(Video Compression Manager, 视 频 压 缩 管 理 器), 它 们 负 责 管 理 系 统 中 所 有 音 频 和 视 频 编 解 码 器(Coder-Decoder,简 称CODEC, 是 实 现 音 频 视 频 数 据 编 解 码 的 驱 动 程 序), 应 用 程 序 可 以 通 过ACM 或VCM 提 供 的 编 程接 口 调 用 这 些 系 统 中 现 成 的 编 解 码 器 来 实 现 音 频 或 视 频 数 据 的 压 缩 和 解 压 缩。95/NT 4.0 系 统自 带 的 音 频CODECs 支 持 一 些 早 期 的 音 频 数 据 压 缩 标 准, 如ADPCM 等,Internet Explorer 4.0 等应 用 程 序 包 含 的 音 频CODECs 支 持 一 些 比 较 新 的 压 缩 标 准, 如MPEG Layer 3 等。 在 控 制 面 板 的 多媒 体 组 件 中 选 择“ 高 级”, 打 开“ 音 频 压 缩 的 编 码 解 码 器”, 就 可 列 出 系 统 中 安 装 的 所 有 音 频CODECs。本 文 所 要 介 绍 的 就 是ACM 音 频 压 缩 接 口 的 编 程 方 法, 所 用 编 程 工 具 为VC++ 5.0。

获 取CODECs 的 信 息

---- ACM API msacm.h 中, 外, ACM mmsystem.hmmreg.h 构。 ACM ACM 用, acmGetVersion ACM 息。

---- 前 面 提 到, 在控 制 面 板 中 可 以 查 看 系 统 中CODECs 的 信 息, 而 在 应 用 程 序 中 也 常 常 需 要 知 道 某 种 音 频CODECs 是否 存 在, 并 获 取 其 编 解 码 参 数 等 信 息, 这 一 点 可 以 通 过 调 用 下 面 两 个 函 数 来 实 现。

---- MMRESULT mmr=acmMetrics(NULL, ACM_METRIC_COUNT_CODECS, &dwCodecs);

---- mmr = acmDriverEnum(CodecsEnumProc, 0, 0);

---- acmMetrics() 函 数 可 以 获 取 许 多ACM 对 象 的 有 用 信 息, 例 如 向 其 中 传 递ACM_METRIC_COUNT_CODECS 可 以 查 询 系 统 中 安 装 的 音 频CODECs 总 数。 函 数acmDriverEnum() 的 功 能 是 枚 举 所 有 的 音 频CODECs,在acmDriverEnum() 的 参 数 中 指 定 回 调 函 数CodecsEnumProc() 可 以 进 一 步 查 询 每 个CODEC 的 信息。Windows 编 程 中 经 常 要 用 到 回 调 函 数, 下 面 是 枚 举 音 频CODECs 的 一 个 回 调 函 数 的 示 例。

 
      
      
 
      
      
BOOL CALLBACK CodecsEnumProc(HACMDRIVERID 
      
      
 
      
      
hadid, DWORD dwInstance, DWORD fdwSupport) {
      
      
 
      
      
DWORD dwSize = 0;
      
      
 
      
      
if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC)
      
      
 
      
      
 printf("多格式转换/n");
      
      
 
      
      
ACMDRIVERDETAILS add;
      
      
 
      
      
acmdd.cbStruct = sizeof(acmdd);
      
      
 
      
      
MMRESULT mmr = acmDriverDetails(hadid, &acmdd, 0);
      
      
 
      
      
if (mmr)  error_msg(mmr);
      
      
 
      
      
else {
      
      
 
      
      
printf(" 全称:  %s/n", acmdd.szLongName);
      
      
 
      
      
printf(" 描述:   %s/n", acmdd.szFeatures);
      
      
 
      
      
}
      
      
 
      
      
HACMDRIVER had = NULL;
      
      
 
      
      
mmr = acmDriverOpen(&had, hadid, 0);      //打开驱动程序
      
      
 
      
      
if (mmr)  error_msg(mmr);
      
      
 
      
      
else {
      
      
 
      
      
mmr = acmMetrics(had, ACM_METRIC_
      
      
 
      
      
MAX_SIZE_FORMAT, &dwSize);
      
      
 
      
      
WAVEFORMATEX* pwf = (WAVEFORMATEX*) malloc(dwSize);
      
      
 
      
      
memset(pwf, 0, dwSize);
      
      
 
      
      
pwf->cbSize = LOWORD(dwSize) - sizeof(WAVEFORMATEX);
      
      
 
      
      
pwf->wFormatTag = WAVE_FORMAT_UNKNOWN;
      
      
 
      
      
ACMFORMATDETAILS fd;
      
      
 
      
      
memset(&fd, 0, sizeof(fd));
      
      
 
      
      
fd.cbStruct = sizeof(fd);  fd.pwfx = pwf;  fd.cbwfx = dwSize;
      
      
 
      
      
fd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
      
      
 
      
      
mmr = acmFormatEnum(had, &fd, FormatEnumProc, 0, 0);  
      
      
 
      
      
if (mmr)  error_msg(mmr);
      
      
 
      
      
free(pwf);
      
      
 
      
      
acmDriverClose(had, 0);
      
      
 
      
      
}
      
      
 
      
      
return TRUE; 
      
      
 
      
      
}
      
      
 
      
      

---- CodecsEnumProc() 共 有 三 个 参 数。 第 一 个 参 数 是 驱 动 程 序 的ID 值; 第 二 个 参 数 是 实 例 数 据, 本文 例 子 中 未 使 用; 第 三 个 参 数 描 述 该 驱 动 程 序 所 支 持 的 功 能, 它 由 一 组 标 识 进 行 或 运 算 构 成, 例如, 如 果 设 置 了 标 识ACMDRIVERDETAILS_SUPPORTF_CODEC, 则 说 明 该 驱 动 程 序 可 以 将 一 种 编 码 格式 的 音 频 信 号 转 换 成 另 一 种 编 码 格 式。 通 过acmDriverDetails() 函 数 可 以 获 得 对 该 驱 动 程 序 进一 步 的 信 息, 如CODEC 的 名 称、 简 单 描 述 等。 以 上 信 息 实 际 上 是 由ACM 收 集, 并 保 存 在ACM 内 部, 所以 查 询 以 上 信 息 时 并 未 真 正 将 驱 动 程 序 加 载 至 内 存。 而 要 获 得 每 一 种 驱 动 程 序 支 持 的 音 频 格 式信 息, 则 必 须 将 驱 动 程 序 加 载 至 内 存, 这 是 通 过acmDriverOpen() 完 成 的, 在 退 出CodecsEnumProc() 前, 还 要 用acmDriverClose() 来 关 闭 已 打 开 的 驱 动 程 序。 在 使 用 音 频 格 式 枚 举 函 数 前, 需 要 先 分配 一 块 缓 冲 区 存 置 格 式 信 息, 缓 冲 区 的 大 小 可 通 过 调 用acmMetrics() 查 询ACM_METRIC_MAX_SIZE_FORMAT 获 得, 格 式 信 息 中 的 音 频 格 式 标 识 设 为WAVE_FORMAT_UNKNOWN。 在 音 频 格 式 枚 举 中 同 样 使 用 了 回调 函 数, 此 回 调 函 数 只 是 列 出 了 该 音 频 格 式 的 名 称 和 标 识 值。

BOOL CALLBACK FormatEnumProc
      
      
 
      
      
(HACMDRIVERID hadid, LPACMFORMATDETAILS
      
      
 
      
      
 pafd, DWORD dwInstance, DWORD fdwSupport) {
      
      
 
      
      
printf("%4.4lXH, %s/n", pafd- >dwFormatTag, pafd- >szFormat);
      
      
 
      
      
return TRUE; 
      
      
 
      
      
}
      
      
 
      
      

---- 上 面 介 绍 了 浏览 系 统 中 所 有 音 频CODECs 及 每 种CODEC 所 支 持 的 音 频 格 式 的 方 法, 某 些 典 型 的 应 用 程 序 可 能 需要 列 出 系 统 中 所 有 可 以 选 用 的CODECs, 并 由 用 户 来 选 择 使 用 哪 一 种CODEC 进 行 压 缩, 此 时 就 需 要利 用 上 面 的 编 程 方 法 来 获 取CODECs 的 信 息。

音 频 数 据 的 压 缩

---- 使 CODEC 程, 序。 8K 样、16bits PCM 码、 道、 1 号。 Windows 95 TrueSpeech CODEC 101 缩。 中,TrueSpeech CODEC 换, 中, CODEC 式, 法, 式, 式, 线 PCM 单, CODEC 持, 线 PCM 种。

---- 在 进 行 压 缩 之前 首 先 需 要 确 定TrueSpeech 驱 动 程 序 的ID 值。 为 此 需 要 用 到acmDriverEnum() 函 数, 对 枚 举 到 的每 一 个 驱 动 程 序, 由acmDriverEnum() 指 定 的 回 调 函 数 将 检 查 其 支 持 的 所 有 音 频 格 式, 若 其 中 包括wFormatTag 值 为WAVE_FORMAT_DSPGROUP_TRUESPEECH 的 音 频 格 式, 则 此 驱 动 程 序 就 是 要 寻 找的TrueSpeech CODEC, 它 所 支 持 的 第 一 种WAVE_FORMAT_DSPGROUP_TRUESPEECH 音 频 格 式 即 为 目标 音 频 压 缩 格 式。 查 询 所 需 的CODEC 及 其 支 持 的 音 频 格 式 的 方 法 见 前 一 小 节 的 介 绍。

---- 根 据 查 询 的 结果, 设hadID 为TrueSpeech CODEC 的ID 值,pwfDrv 为 指 向 目 标WAVEFORMATEX 结 构 的 指 针, 接 下 来利 用 获 得 的ID 值 打 开 相 应 的 驱 动 程 序。

HACMDRIVER had = NULL;
      
      
 
      
      
mmr = acmDriverOpen(&had, hadID, 0);
      
      
 
      
      
if(mmr) {  printf(" 打开驱动程序失败/n"); exit(1);  }
      
      
 
      
      

---- 压 缩 和 解 压 缩一 样, 都 是 将 音 频 信 号 从 一 种 音 频 格 式 转 换 成 另 一 种 格 式, 要 完 成 这 一 过 程, 首 先 要 打 开 转 换 流。在 用acmStreamOpen 打 开 转 换 流 时, 我 们 指 定 了ACM_STREAMOPENF_NONREALTIME 标 志, 它 表 示 转换 无 需 实 时 进 行。 因 为 很 多 压 缩 算 法 的 计 算 量 是 相 当 大 的, 实 时 完 成 几 乎 是 不 可 能 的, 例 如 在 本例 中, 如 果 不 指 定 此 标 志,TrueSpeech CODEC 就 会 返 回“ 无 法 完 成” 的 错 误。

HACMSTREAM hstr = NULL;
      
      
 
      
      
DWORD dwSrcBytes = dwSrcSamples * wfSrc.wBitsPerSample / 8;
      
      
 
      
      
mmr = acmStreamOpen(&hstr,had, //驱动程序句柄
      
      
 
      
      
pwfSrc, //指向源音频格式的指针
      
      
 
      
      
pwfDrv, //指向目标音频格式的指针
      
      
 
      
      
NULL, //无过滤器
      
      
 
      
      
NULL, //无回调函数
      
      
 
      
      
0,ACM_STREAMOPENF_NONREALTIME);
      
      
 
      
      

---- 在 真 正 进 行 转换 之 前, 还 必 须 准 备 转 换 流 的 信 息 头。 下 面 一 段 代 码 中, 先 利 用 源 数 据 的 大 小 以 及 目 标 格 式 的 平均 数 据 率 估 算 目 标 数 据 的 缓 存 区 大 小, 然 后 调 用acmStreamPrepareHeader 为 转 换 准 备 信 息 头。

---- DWORD dwDstBytes=pwfDrv->nAvgBytesPerSec*dwSrcSamples/wfSrc.nSamplesPerSec;

---- dwDstBytes = dwDstBytes*3/2; // 计 算 压 缩 后 音 频 数 据 大 小, 并 依 此 适 当 增 加 输 出 缓 冲 区 的 大 小。

BYTE* pDstData = new BYTE [dwDstBytes];
      
      
 
      
      
ACMSTREAMHEADER shdr;
      
      
 
      
      
memset(&strhdr, 0, sizeof(shdr));
      
      
 
      
      
shdr.cbStruct = sizeof(shdr);
      
      
 
      
      
shdr.pbSrc = pSrcData;          //源音频数据区
      
      
 
      
      
shdr.cbSrcLength = dwSrcBytes;
      
      
 
      
      
shdr.pbDst = pDstData; //压缩后音频数据缓冲区
      
      
 
      
      
shdr.cbDstLength = dwDstBytes;
      
      
 
      
      
mmr = acmStreamPrepareHeader(hstr, &shdr, 0); 
      
      
 
      
      

---- 语 音 数 据 真 正的 压 缩 过 程 是 由 函 数acmStreamConvert() 完 成 的。 在 调 用acmStreamConvert() 时 可 以 指 定 回 调函 数, 以 便 在 转 换 过 程 中 显 示 进 度 信 息 等。 在 本 例 中, 未 指 定 回 调 函 数, 只 是 简 单 地 等 待 压 缩 的结 束。

---- mmr = acmStreamConvert(hstr, &shdr, 0);

---- 数 据 压 缩 完 毕后, 应 用 程 序 就 可 以 把 缓 冲 区 中 的 数 据 写 入 目 标 文 件 中。

---- 最 后, 必 须 关闭 转 换 流 和 驱 动 程 序。

mmr = acmStreamClose(hstr, 0);
      
      
 
      
      
mmr = acmDriverClose(had, 0);
      
      
 
      
      
---- ACM CODEC 程, ACM VC++ 5 ACM
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值