You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++/CLI中使用DeviceCapabilities()的DC_BINNAMES参数

在C++/CLI中使用DeviceCapabilities()的DC_BINNAMES参数

要在C++/CLI中通过DeviceCapabilities()的DC_BINNAMES参数获取打印机进纸器名称,需遵循先获取缓冲区大小、再分配内存、最后提取数据的流程,以下是完整实现步骤和修正后的代码:

核心步骤说明

  1. 获取进纸器数量:第一次调用DeviceCapabilities(),传入DC_BINNAMES且缓冲区为NULL,返回值即为打印机支持的进纸器总数nCount。
  2. 分配缓冲区:每个进纸器名称固定占用32个宽字符(含终止符),缓冲区总大小为nCount * 32 * sizeof(WCHAR)。
  3. 填充并提取名称:第二次调用DeviceCapabilities()填充缓冲区,随后遍历缓冲区逐个提取进纸器名称。

完整代码示例

#include <windows.h>
#include <iostream>
#include <msclr/marshal.h>

using namespace System;
using namespace msclr::interop;

void GetPrinterBinNames(String^ printerName)
{
    // 将C++/CLI字符串转换为原生宽字符指针
    const wchar_t* nativePrinterName = marshal_as<const wchar_t*>(printerName);

    // 第一步:获取进纸器数量
    int nCount = DeviceCapabilitiesW(nativePrinterName, NULL, DC_BINNAMES, NULL, NULL);
    if (nCount <= 0)
    {
        std::wcerr << L"获取进纸器数量失败,错误码:" << GetLastError() << std::endl;
        return;
    }

    // 第二步:分配缓冲区(每个名称占32个WCHAR)
    const int BIN_NAME_LENGTH = 32;
    WCHAR* binNamesBuf = new WCHAR[nCount * BIN_NAME_LENGTH];
    if (!binNamesBuf)
    {
        std::wcerr << L"内存分配失败" << std::endl;
        return;
    }

    // 第三步:填充缓冲区
    int result = DeviceCapabilitiesW(nativePrinterName, NULL, DC_BINNAMES, reinterpret_cast<LPTSTR>(binNamesBuf), NULL);
    if (result != nCount)
    {
        std::wcerr << L"获取进纸器名称失败,错误码:" << GetLastError() << std::endl;
        delete[] binNamesBuf;
        return;
    }

    // 第四步:遍历输出所有进纸器名称
    for (int i = 0; i < nCount; i++)
    {
        const WCHAR* binName = binNamesBuf + (i * BIN_NAME_LENGTH);
        std::wcout << L"进纸器 " << i + 1 << L":" << binName << std::endl;
    }

    // 释放内存
    delete[] binNamesBuf;
}

// 调用示例
int main()
{
    String^ printerName = L"你的打印机名称";
    GetPrinterBinNames(printerName);
    return 0;
}

关键细节说明

  • 字符串转换:C++/CLI的System::String^需通过marshal_as转换为原生const wchar_t*,确保与Win32 API兼容。
  • 缓冲区处理:每个进纸器名称是连续存储的32字符块,遍历需按偏移量i * 32定位起始地址(原代码直接访问sizeBuf[i]是错误的)。
  • 错误处理:必须检查DeviceCapabilities()返回值,若为负数则调用失败,可通过GetLastError()获取具体错误码。
  • 内存管理:手动分配的缓冲区使用完成后需释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者pol9595

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:32:09