6.3. 调 用 动 态 链 接 库 (DLL) 相 对 于 CIN 来 讲,NI 更 推 荐 用 户 使 用 DLL 来 共 享 基 于 文 本 编 程 语 言 开 发 的 代 码 除 了 共 享 或 重 复 利 用 代 码, 开 发 人 员 还 能 利 用 DLL 封 装 软 件 的 功 能 模 块, 以 便 这 些 模 块 能 被 不 同 开 发 工 具 利 用 在 LabVIEW 中 使 用 DLL 一 般 有 以 下 几 种 途 径 : 1. 使 用 自 己 开 发 DLL 中 的 函 数 2. 调 用 操 作 系 统 或 硬 件 驱 动 供 应 商 提 供 的 API 对 于 前 一 种 方 法 来 说, 又 可 以 通 过 以 下 几 步 来 实 现 : a) 在 LabVIEW 中 定 义 DLL 原 型 ; b) 生 成.C 或.C++ 文 件, 完 成 实 现 函 数 功 能 的 代 码 并 为 函 数 添 加 DLL 导 出 声 明 ; c) 通 过 外 部 IDE( 如 VC++) 创 建 DLL 项 目 并 编 译 生 成.dll 文 件 d) 在 LabVIEW 项 目 中 使 用 DLL 中 的 函 数 以 下 章 节 将 通 过 实 例 对 这 两 种 情 况 详 细 进 行 叙 述 6.3.1. 配 置 Call Library Function Node(CFN) 无 论 在 LabVIEW 中 使 用 自 己 开 发 的 DLL, 硬 件 驱 动 供 应 商 或 者 操 作 系 统 提 供 的 API, 都 可 以 通 过 配 置 Call Library Function Node (CFN, 图 6-12) 来 完 成 图 6-12 LabVIEW 的 Call Library Function Node 在 CFN 图 标 的 右 键 菜 单 上 选 择 Configure 打 开 Call Library Function 配 置 对 话 框 ( 图 6-13) 通 过 该 对 话 框, 可 以 指 定 动 态 库 存 放 路 径 调 用 的 函 数 名 以 及 传 递 给 函 数 的 参 数 类 型 和 函 数 返 回 值 的 类 型 在 配 置 完 后,CLF 节 点 会 根 据 用 户 的 配 置 自 动 更 新 其 显 示 通 过 Browse 按 钮 或 者 直 接 在 Library Name or Path 输 入 框 中 指 定 调 用 函 数 多 在.dll 文 件 的 路 径 通 过 Browse 按 钮 下 的 控 件 用 户 可 以 指 定 多 个 线 程 同 时 调 用 DLL 默 认 情 况 下,LabVIEW 以 Run 11
in UI Thread 方 式 调 用 DLL, 调 用 的 函 数 将 直 接 在 用 户 线 程 中 运 行 另 外 一 种 方 式 为 递 归 方 式 Reentrant, 在 这 种 情 况 下 可 以 允 许 多 个 线 程 同 时 调 用 DLL 中 的 函 数 但 要 确 保 正 常 调 用, 必 须 使 DLL 中 的 代 码 线 程 安 全 以 下 是 一 些 最 基 本 的 线 程 安 全 特 性 : a. 代 码 不 含 有 未 受 保 护 的 全 局 数 据 ( 如 全 局 变 量, 文 件 ); b. 代 码 不 访 问 硬 件 ( 即 不 含 有 寄 存 器 一 级 的 代 码 ); c. 代 码 不 调 用 非 线 程 安 全 的 函 数 DLL 或 者 驱 动 ; d. 代 码 使 用 信 号 量 或 者 互 斥 量 来 保 护 全 局 量 ; e. 代 码 被 一 个 非 递 归 的 VI 调 用 时 为 线 程 安 全 图 6-13 CLF 配 置 对 话 框 在 Function Name 输 入 框 中 指 定 要 调 用 函 数 的 函 数 名 通 过 Call Conventions 下 拉 列 表 框 指 定 调 用 DLL 中 函 数 的 方 式 可 以 指 定 调 用 方 式 为 C ( 默 认 方 式 ) 或 Windows 标 准 调 用 方 式 stdcall 一 般 来 说 用 C 方 式 调 用 开 发 人 员 自 己 写 的 DLL 函 数, 而 stdcall 一 般 做 为 标 准 调 用 方 式 来 调 用 windows 的 API 通 过 Parameter 域 可 以 指 定 所 调 用 函 数 的 返 回 值 类 型 默 认 情 况 下 CFN 节 点 没 有 输 入 参 数 而 且 只 有 一 个 void 类 型 的 返 回 参 数 该 参 数 由 CFN 节 点 第 一 对 连 接 点 的 右 端 返 回, 代 表 CFN 执 行 结 果 如 果 返 回 参 数 的 类 型 是 void 类 型, 则 CFN 连 接 点 为 未 启 用 状 态 ( 保 持 为 灰 色 ) CFN 的 每 一 对 连 接 点 代 表 一 个 输 入 或 输 出 参 数, 若 要 传 递 参 数 给 CFN 则 将 参 数 连 接 至 相 应 连 接 点 的 左 端, 若 要 读 取 返 回 值, 则 将 相 应 连 接 点 的 右 端 连 接 到 Indicator CFN 返 回 参 数 的 类 型 可 以 是 Void,Numeric 或 String 只 能 为 返 回 参 数 指 定 Void 类 型, 输 入 参 数 不 能 指 定 为 Void 类 型 调 用 的 函 数 没 有 返 回 值 时, 指 定 CFN 的 返 回 参 数 类 型 为 void 类 型 即 使 参 数 有 确 定 类 型 的 返 回 值, 也 可 以 指 定 CFN 的 返 回 类 型 为 Void, 但 是 此 时, 函 数 的 返 回 值 将 被 忽 略 有 些 时 候, 调 用 的 函 数 返 回 值 不 是 以 上 三 种 类 型, 可 以 使 用 与 以 上 三 种 类 中 有 相 同 大 小 的 一 个 来 代 替 例 如 如 果 调 用 的 函 数 返 回 一 个 Char 类 型 数 据, 则 可 以 用 一 个 8-bit unsigned integer 的 Numeric 类 型 来 代 替 此 外, 由 于 LabVIEW 中 没 有 指 针, 因 此 调 用 DLL 中 的 返 回 指 针 的 函 数 似 乎 不 可 能 但 是 可 以 设 定 返 回 值 类 型 为 一 个 与 指 针 有 相 同 大 小 的 Integer 类 型,LabVIEW 将 把 地 址 以 整 型 值 来 看 待, 并 且 用 户 可 以 在 以 后 的 调 用 中 直 接 使 用 它 12
通 过 Parameter 域 和 其 右 边 的 Add a Parameter Before, Add a Parameter After 和 Delete this Parameter 三 个 按 钮 可 以 增 加 删 除 以 及 修 改 CFN 的 输 入 参 数 和 类 型 当 用 户 选 择 某 参 数 的 类 型 后, 其 详 细 的 数 据 类 型 列 表 和 参 数 传 递 方 式 列 表 将 显 示 出 来, 以 方 便 进 行 详 细 设 定 表 6-1 列 出 了 可 以 设 定 的 输 入 参 数 类 型 及 其 详 细 数 据 类 型 信 息 参 数 类 型 说 明 Numeric 型 参 数 有 以 下 几 种 数 据 类 型 : 8 16 32 和 64 位 符 号 和 无 符 号 整 型 (Signed or Unsigned Integer) Numeric 4 字 节 单 精 度 类 型 (4-byte single) 8 字 节 双 精 度 类 型 (8-byte Double) 利 用 Pass 下 拉 列 表 指 定 传 递 参 数 指 针 或 是 传 递 参 数 的 指 针 Array 型 参 数 的 数 据 类 型 同 Numeric 型 参 数 的 数 据 类 型 ; 通 过 Dimensions 指 定 数 组 的 维 数 ; Array Format 有 以 下 几 种 选 项 : Array Array Data Pointer 传 递 一 维 指 针 到 数 组 值 Array handle 传 递 一 个 指 向 数 组 每 一 维 的 4 个 字 节 指 针 的 指 针, 其 后 为 数 组 的 值 array handle Pointer 为 数 组 的 句 柄 传 递 一 个 指 针 用 String Format 下 拉 列 表 框 选 择 字 符 串 类 型 C String Pointer 以 null 字 符 结 束 的 字 符 串 String Pascal String Pointer 附 加 长 度 字 节 的 字 符 串 string handle 一 个 指 向 4 个 字 节 长 度 信 息 指 针, 其 后 为 字 符 串 的 值 string handle Pointer Waveform 类 型 的 参 数 默 认 类 型 为 8-byte double, 因 此 一 般 没 有 必 要 为 其 指 定 数 据 类 型 但 是 必 须 为 其 指 定 维 数, 如 果 参 数 为 单 独 的 Waveform, 则 指 定 Dimensions 为 Waveform 0, 如 果 参 数 为 waveform 数 组, 则 指 定 Dimensions 为 1 注 意 :LabVIEW 不 支 持 超 过 1D 的 waveform 数 组! 如 果 参 数 为 digital waveform 数 组, 则 指 定 Dimensions 为 1, 否 则 为 0 Digital Waveform 注 意 :LabVIEW 不 支 持 超 过 1D 的 waveform 数 组! 如 果 参 数 为 digital data 数 组, 则 指 定 Dimensions 为 1, 否 则 为 0 Digital Data 注 意 :LabVIEW 不 支 持 超 过 1D 的 digital Data 数 组! Data Type 下 拉 列 表 框 有 以 下 选 择 : ActiveX Variant Pointer 传 递 一 个 指 向 ActiveX 数 据 的 指 针 ActiveX IDispatch* Pointer 传 递 一 个 指 向 ActiveX 自 动 化 服 务 器 IDispatch 接 口 的 指 针 IUnknown Pointer 传 递 一 个 指 向 ActiveX 自 动 化 服 务 器 IUnknown 接 口 的 指 针 Adapt to Type 用 来 传 递 LabVIEW 独 有 的 数 据 类 型 给 DLL 表 6-2 CFN 输 入 参 数 的 类 型 有 时 可 能 在 CFN 配 置 对 话 框 中 并 不 能 找 到 要 传 递 给 它 的 参 数 类 型, 在 这 种 情 况 下 可 以 通 过 下 面 方 法 来 解 决 如 果 参 数 不 含 指 针, 则 可 以 通 过 Flatten to String 函 数 ( ) 将 参 数 转 换 为 字 符 串, 并 将 此 字 符 串 指 针 传 递 给 函 数 还 有 其 它 一 些 技 巧 请 参 见 NI 手 册 设 定 后 的 最 终 结 果 显 示 在 Function Prototype 文 本 框 中, 在 确 认 前, 可 以 在 此 检 查 设 定 是 否 正 确 如 果 不 正 确 可 以 在 此 修 改 设 定 13
6.3.2. 调 用 自 己 开 发 DLL 中 的 函 数 开 发 人 员 可 以 在 LabVIEW 中 指 定 DLL 函 数 的 原 型, 然 后 在 外 部 IDE 中 完 成 代 码 并 编 译 生 成.dll 文 件 以 供 项 目 使 用 下 面 就 以 一 个 简 单 的 求 数 组 求 和 的 项 目 为 例 来 说 明 这 种 开 发 过 程 1. 在 LabVIEW 中 创 建 DLL 函 数 原 型 a) 在 LabVIEW 的 diagram 面 板 上 添 加 一 个 CFN 并 通 过 其 右 键 菜 单 打 开 CFN 的 配 置 对 话 框 ; b) 使 Library Name or Path 输 入 框 为 空 ; c) 指 定 函 数 名 Function Name 和 调 用 方 式 Calling Conventions 分 别 为 add_num 和 C; d) 重 命 名 返 回 参 数 的 名 称 为 error, 并 指 定 其 类 型 为 Numeric 的 Signed 32-bit Integer; e) 用 Add a Parameter After 按 钮 添 加 第 一 个 参 数 p, 指 定 其 类 型 为 Array 的 4-byte Single 并 设 定 Array Format 为 Array Data Pointer; f) 用 Add a Parameter After 按 钮 添 加 第 二 个 参 数 size, 指 定 其 类 型 为 为 Numeric 的 Signed 32-bit Integer 并 设 置 参 数 传 递 方 式 为 Value; g) 用 Add a Parameter After 按 钮 添 加 第 三 个 参 数 sum, 指 定 其 类 型 为 为 Numeric 的 4-byte Single 并 设 置 参 数 传 递 方 式 为 Pointer to Value; h) 至 此, 函 数 的 原 型 应 如 下 所 示 ( 图 6-14): long add_num(float *p, long size, float *sum); 图 6-14 CFN 的 配 置 结 果 i) 确 定 后 会 发 现 CFN 根 据 配 置 自 动 进 行 了 更 新 更 新 后 的 情 况 如 右 图 示 2. 生 成.C 或.C++ 文 件, 完 成 实 现 函 数 功 能 的 代 码 并 为 函 数 添 加 DLL 导 出 声 明 ; 在 CFN 节 点 上 通 过 右 键 菜 单 选 择 Create.C File 生 成 mydll.c 文 件, 其 内 容 如 下 : /* Call Library source file */ 14
#include "extcode.h" long add_num(float p[], long size, float *sum); long add_num(float p[], long size, float *sum) { /* Insert code here */ } 将 以 下 代 码 插 入 到 /* Insert code here */ 句 之 后 实 现 函 数 的 功 能 int i; float tmpsum = 0; if(p!= NULL) { for(i=0; i < size; i++) tmpsum = tmpsum + p[i]; } else return (1); * sum = tmpsum; return (0); 在 完 成 实 现 函 数 功 能 的 代 码 后, 还 必 须 为 函 数 添 加 导 出 声 明 以 便 能 在 LabVIEW 中 使 用 这 些 函 数 C/C++ 声 名 导 出 函 数 的 关 键 字 是 _declspec (dllexport), 使 用 该 关 键 字 可 以 代 替 模 块 定 义 文 件 对 于 此 处 的 例 子 来 说, 只 要 在 函 数 声 明 和 定 义 部 分 添 加 关 键 字 即 可 最 终 代 码 如 下 : /* Call Library source file */ #include "extcode.h" _declspec (dllexport) long add_num(float p[], long size, float *sum); _declspec (dllexport) long add_num(float p[], long size, float *sum) { /* Insert code here */ int i; float tmpsum = 0; if(p!= NULL) { for(i=0; i < size; i++) tmpsum = tmpsum + p[i]; } else return (1); * sum = tmpsum; return (0); } 3. 在 外 部 IDE( 以 VC++ 为 例 ) 中 创 建 DLL 项 目 并 编 译 生 成.dll 文 件 用 VC++ 6.0 进 行 编 译 生 成.dll 文 件 的 步 骤 如 下 : a) 在 VC++ 中 创 建 一 个 DLL 项 目, 如 果 在 DLL 中 没 有 使 用 MFC 就 选 择 创 建 Win32 15
Dynamic-Link Library, 否 则 选 择 MFC AppWizard(dll), 对 此 例 子 来 说 选 择 前 者 选 定 后 进 入 下 一 步 选 择 创 建 一 个 空 的 DLL 项 目 b) 通 过 Project»Add to Project»Files 添 加 mydll.c 到 创 建 的 mydll 项 目 之 中 c) 通 过 Project»Settings 打 开 项 目 配 置 对 话 框, 选 择 C/C++ 选 项 卡 d) 配 置 项 目 的 All Configurations 选 择 Settings For 下 拉 列 表 框 中 的 All Configurations, 选 择 Category 下 拉 列 表 框 中 的 Code Generation, 最 后 设 置 Struct member alignment 为 1 Byte 配 置 结 果 如 图 6-15 图 6-15 配 置 项 目 的 All Configurations e) 配 置 项 目 的 Release 版 本 选 择 Settings For 下 拉 列 表 框 中 的 Win32 Release, 选 择 Category 下 拉 列 表 框 中 的 Code Generation, 最 后 从 Use run-time library 下 拉 列 表 框 中 选 择 Multithreaded DLL 配 置 结 果 如 图 6-16 f) 配 置 项 目 的 Debug 版 本 选 择 Settings For 下 拉 列 表 框 中 的 Win32 Debug, 选 择 Category 下 拉 列 表 框 中 的 Code Generation, 最 后 从 Use run-time library 下 拉 列 表 框 中 选 择 Debug Multithreaded DLL 配 置 结 果 如 图 6-17 16
图 6-16 配 置 项 目 的 Release 版 本 图 6-17 配 置 项 目 的 Debug 版 本 17
4. 在 LabVIEW 项 目 中 调 用.dll 中 的 函 数 创 建 如 图 6-18 所 示 的 VI, 其 中 Array 为 Representation»Single Precision 类 型 的 数 组,Sum 为 Representation»Single Precision 类 型 的 Indicator, error 为 Representation»Long 类 型 的 Indicator 运 行 后 可 以 看 到 对 数 组 求 和 的 结 果 图 6-18 调 用 DLL 中 函 数 的 VI 6.3.3. 调 用 Win32 API 在 LabVIEW 可 以 通 过 CFN 调 用 Win32 API 或 者 是 硬 件 驱 动 供 应 商 提 供 的 驱 动 程 序 通 过 调 用 这 些 函 数 用 户 能 利 用 与 操 作 系 统 进 行 交 互 或 者 利 用 第 三 方 供 应 商 提 供 的 函 数 来 扩 展 自 己 项 目 的 功 能 以 下 章 节 以 调 用 Win32 API 中 MessageBox 函 数 来 实 现 一 个 同 时 带 Abort, Retry, Ignore 按 钮 和 一 个 警 告 图 标 的 消 息 对 话 框 为 例, 叙 述 在 LabVIEW 中 利 用 CFN 调 用 Win32 API 的 方 法 要 在 LabVIEW 项 目 中 调 用 Win32 API, 首 先 要 从 Microsoft 提 供 的 相 关 开 发 文 档 中 找 到 所 要 调 用 API 函 数 的 原 型 和 其 所 在.dll 文 件 的 名 字 要 查 找 这 些 信 息, 可 以 参 考 Microsoft Software Development Kit (SDK) 或 MSDN 的 相 关 文 档 从 文 档 中 找 到 MessageBox 函 数 的 原 型 和 相 关 的 一 些 信 息 如 下 int MessageBox(HWND hwnd, // 父 窗 口 的 句 柄 LPCTSTR lptext, // 消 息 窗 中 显 示 的 文 本 LPCTSTR lpcaption, // 消 息 窗 的 标 题 UINT utype); // 消 息 窗 的 类 型 ----Requirements:---- Windows: Requires Windows 98 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winuser.h. Import Library: Use user32.lib. Unicode: Implemented as Unicode and ANSI versions on Windows. 找 到 这 些 信 息 后, 就 可 以 进 行 调 用 API 函 数 的 的 第 二 步 : 将 参 数 类 型 映 射 为 LabVIEW 支 持 的 数 据 类 型 Win32 API 函 数 用 了 多 种 非 标 准 C 的 数 据 类 型, 这 给 在 LabVIEW 中 调 用 API 带 来 了 一 点 麻 烦 但 是 幸 运 的 是, API 函 数 所 用 的 这 些 非 标 准 数 据 类 型 只 仅 仅 是 标 准 C 数 据 类 型 的 别 名 例 如 上 面 例 子 中 MessageBox 函 数 使 用 的 参 数 类 型 与 标 准 C 的 参 数 类 型 有 以 下 映 射 关 系 : HWND = int * * LPCTSTR = const char * 18
UINT = unsigned int 可 直 接 将 LPCTSTR 和 UINT 映 射 为 LabVIEW 支 持 的 类 型 LPCTSTR 与 C 语 言 字 符 串 等 价,UINT 等 价 于 LabVIEW 的 U32 数 据 类 型 但 是 映 射 HWND 稍 微 有 点 麻 烦 HWND 是 指 向 整 型 数 指 针 的 指 针 观 察 MessageBox 函 数 中 HWND 的 作 用, 可 以 看 出 此 参 数 只 仅 仅 用 来 标 识 消 息 窗 父 窗 口 的 句 柄, 因 此, 我 们 没 有 必 要 知 道 句 柄 本 身 的 值, 而 只 要 关 注 HWND 参 数 本 身, 由 于 HWND 是 指 向 整 型 数 指 针 的 指 针, 因 此 可 以 将 它 看 作 32 位 无 符 号 整 型 量 (U32) 在 Windows SDK 中 有 很 多 以 H 开 头 的 量 ( 句 柄 ), 一 般 说 来, 在 开 发 过 程 中, 都 可 以 将 它 看 作 32 位 无 符 号 整 型 量 (U32) 而 不 必 关 心 它 本 身 的 值 如 果 不 能 确 定 API 函 数 参 数 数 据 类 型 所 对 应 的 标 准 C 语 言 数 据 类 型, 可 以 在 头 文 件 windef.h 中 查 找 相 应 的 #define 或 typedef 定 义 有 了 这 些 等 价 转 换, 还 要 关 注 API 函 数 中 常 量 与 LabVIEW 中 数 据 类 型 或 表 示 方 法 的 映 射 在 Visual Studio 中, 编 程 人 员 一 般 不 直 接 使 用 常 量 的 值, 而 是 使 用 与 预 定 义 的 常 量 名, 但 是 在 LabVIEW 中 却 必 须 使 用 实 际 的 值 例 如 对 于 MessageBox 函 数 来 说, 代 表 消 息 窗 类 型 的 参 数 utype 可 以 使 用 下 表 中 几 个 常 量 常 量 说 明 MB_ABORTRETRYIGNORE 带 有 Abort, Retry, Ignore 按 钮 的 消 息 窗 MB_CANCELTRYCONTINUE Win2000 上 可 替 代 MB_ABORTRETRYIGNORE 量, 具 有 Cancel, Try Again, Continue 按 钮 的 消 息 窗 MB_HELP Win2K/XP 上 为 消 息 窗 添 加 Help 按 钮 并 在 用 户 按 下 此 按 钮 时 发 送 WM_HELP 消 息 给 父 窗 口 的 的 消 息 窗 MB_OK 默 认 值 只 有 一 个 OK 按 钮 的 消 息 窗 MB_ICONWARNING 带 有 警 告 图 标 的 消 息 窗 通 过 在 SDK 文 档 中 查 找 到 的 信 息 (Header: Declared in winuser.h.) 知 道 这 些 常 量 在 头 文 件 winuser.h 中 有 定 义 通 过 该 头 文 件 可 以 找 到 相 关 定 义 如 下 #ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif... #define MB_OK 0x00000000L #define MB_ABORTRETRYIGNORE 0x00000002L #define MB_ICONWARNING MB_ICONEXCLAMATION #define MB_ICONEXCLAMATION 0x00000030L 在 SDK 文 档 中, 常 量 通 常 取 位 域 中 的 某 一 位 作 为 其 值 位 域 是 通 常 是 指 一 个 每 一 位 控 制 某 种 属 性 的 单 个 整 型 量 通 过 或 运 算 ( ) 可 以 将 多 个 常 量 组 合 起 来 达 到 多 种 需 要 的 效 果 从 逻 辑 运 算 角 度 来 讲, 进 行 或 运 算 等 价 于 选 择 了 位 域 中 的 多 个 控 制 位 例 如 可 以 通 将 MB_ABORTRETRYIGNORE 和 MB_ICONEXCLAMATION 进 行 或 运 算 后 的 值 传 给 utype 可 以 创 建 一 个 同 时 带 Abort, Retry, Ignore 和 一 个 警 告 图 标 的 消 息 窗 MB_ABORTRETRYIGNORE 的 值 为 0x02, MB_ICONEXCLAMATION 的 值 为 0x30, 经 过 或 运 算 后 的 值 为 0x32 在 Visual Studio 开 发 中 可 以 直 接 将 MB_ABORTRETRYIGNORE MB_ICONEXCLAMATION 常 量 或 运 算 表 达 式 作 为 参 数 utype 传 递 给 MessageBox 函 数 来 实 现 一 个 同 时 带 Abort, Retry, Ignore 按 钮 和 一 个 警 告 图 标 的 消 息 对 话 框, 但 是 LabVIEW 却 不 支 持 这 种 形 式 的 参 数 传 递 因 此 必 须 将 常 量 表 达 式 转 换 为 LabVIEW 支 持 的 形 式 这 可 以 通 过 表 达 式 来 实 现 注 意 其 中 数 字 均 为 十 六 进 制 数 最 后 还 要 根 据 开 发 项 目 是 ANSI 项 目 还 是 Unicode 项 目, 并 参 照 SDK 文 档 选 择 合 适 的 函 数 一 般 来 说 大 多 数 LabVIEW 项 目 均 为 ANSI 项 目, 因 为 大 多 数 LabVIEW 的 字 符 串 均 为 ANSI 标 准 字 符 串 对 于 此 处 的 例 子 19
来 说, 通 过 参 看 从 SDK 文 档 中 获 取 的 信 息 可 知 MessageBox 函 数 有 ANSI 和 Unicode 两 种 实 现 (Unicode: Implemented as Unicode and ANSI versions on Windows.) 查 看 头 文 件 winuser.h 中 内 容 ( 参 见 上 页 表 ) 可 知 对 于 ANSI 类 型 的 项 目 应 选 择 函 数 名 MessageBoxA 实 际 上 在 库 文 件 user32.dll( 在 windows 中 相 对 于 静 态 库 文 件 一 般 都 存 在 一 个 同 名 的 动 态 库 文 件 ) 中, 只 存 在 函 数 MessageBoxA 和 MessageBoxW 并 没 有 MessageBox 函 数 的 实 体 综 上 所 述, 要 调 用 API 实 现 一 个 同 时 带 Abort, Retry, Ignore 按 钮 和 一 个 警 告 图 标 的 消 息 对 话 框 可 对 CFN 节 点 完 成 如 图 6-19 所 示 的 配 置 图 6-19 CFN 节 点 的 配 置 完 成 后 VI 的 后 面 板 和 运 行 结 果 可 能 如 图 6-20 所 示 图 6-20 VI 的 后 面 板 和 运 行 结 果 20