lusonan 2021-11-22 09:13 采纳率: 100%
浏览 23
已结题

如何此代码基础上实现将获取的信息输出到TXT

目前就是想把输出结果写入到一个txt文件到工具目录
https://blog.csdn.net/tody_guo/article/details/23867253?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163754324716780265467832%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163754324716780265467832&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-23867253.pc_search_result_cache&utm_term=DMI%E4%BF%A1%E6%81%AF&spm=1018.2226.3001.4187
用的是这段代码
输出结果是这样的:

img

代码详情:


#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <string>

using namespace std;

typedef struct _dmi_header
{
    BYTE type;
    BYTE length;
    WORD handle;
}dmi_header; //声明结构体dmi_header

typedef struct _RawSMBIOSData
{
    BYTE    Used20CallingMethod;
    BYTE    SMBIOSMajorVersion;
    BYTE    SMBIOSMinorVersion;
    BYTE    DmiRevision;
    DWORD   Length;
    BYTE    SMBIOSTableData[1];
}RawSMBIOSData; //声明结构体RawSMBIOSData

    const char *dmi_chassis_type(BYTE code)
    {
        
        static const char *type[] = {
            "Other",
            "Unknown",
            "Desktop",
            "Low Profile Desktop",
            "Pizza Box",
            "Mini Tower",
            "Tower",
            "Portable",
            "Laptop",
            "Notebook",
            "Hand Held",
            "Docking Station",
            "All In One",
            "Sub Notebook",
            "Space-saving",
            "Lunch Box",
            "Main Server Chassis",
            "Expansion Chassis",
            "Sub Chassis",
            "Bus Expansion Chassis",
            "Peripheral Chassis",
            "RAID Chassis",
            "Rack Mount Chassis",
            "Sealed-case PC",
            "Multi-system",
            "CompactPCI",
            "AdvancedTCA",
            "Blade",
            "Blade Enclosing"
        };

        code &= 0x7F;

        if (code >= 0x01 && code <= 0x1D)
            return type[code - 0x01];
        return "unknown";
    }

    void dmi_system_uuid(const BYTE *p, short ver, std::string &uuid)
    {
        int only0xFF = 1, only0x00 = 1;
        int i;

        for (i = 0; i < 16 && (only0x00 || only0xFF); i++)
        {
            if (p[i] != 0x00) only0x00 = 0;
            if (p[i] != 0xFF) only0xFF = 0;
        }

        if (only0xFF)
        {
            printf("Not Present");
            return;
        }
        if (only0x00)
        {
            printf("Not Settable");
            return;
        }

        char ch[256]; memset(ch, 0, sizeof(ch));
        if (ver >= 0x0206)
            sprintf(ch, "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X",
                p[3], p[2], p[1], p[0], p[5], p[4], p[7], p[6],
                p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
        else
            sprintf(ch, "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X",
                p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
                p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
        printf("%s\n", ch);
        uuid = std::string(ch);
    }

    const char *dmi_string(const dmi_header *dm, BYTE s)
    {
        char *bp = (char *)dm;
        size_t i, len;

        if (s == 0)
            return "Not Specified";

        bp += dm->length;
        while (s > 1 && *bp)
        {
            bp += strlen(bp);
            bp++;
            s--;
        }

        if (!*bp)
            return "BAD_INDEX";


        len = strlen(bp);
        for (i = 0; i < len; i++)
            if (bp[i] < 32 || bp[i] == 127)
                bp[i] = '.';

        return bp;
    }

    int GetSystemUUID(std::string &uuid)
    {
        int ret = 0;
        RawSMBIOSData *Smbios;
        dmi_header *h = NULL;
        int flag = 1;

        ret = GetSystemFirmwareTable('RSMB', 0, 0, 0);
        if (!ret)
        {
            printf("Function failed!\n");
            return 1;
        }


        DWORD bufsize = ret;
        char *buf = new char[bufsize];
        memset(buf, 0, bufsize);

        ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize);
        if (!ret)
        {
            printf("Function failed!\n");
            delete[]buf;
            return 1;
        }

        Smbios = (RawSMBIOSData *)buf;

        BYTE *p = Smbios->SMBIOSTableData;

        if (Smbios->Length != bufsize - 8)
        {
            printf("Smbios length error\n");
            delete[]buf;
            return 1;
        }

        for (int i = 0; Smbios->Length; i++) {
            h = (dmi_header *)p;

            if (h->type == 0 && flag) {
                printf("\nType %02d - [BIOS]\n", h->type);
                printf("\tBIOS Vendor : %s\n", dmi_string(h, p[0x4]));
                printf("\tBIOS Version: %s\n", dmi_string(h, p[0x5]));
                printf("\tRelease Date: %s\n", dmi_string(h, p[0x8]));
                if (p[0x16] != 0xff && p[0x17] != 0xff)
                    printf("\tEC version: %d.%d\n", p[0x16], p[0x17]);

                flag = 0;
            }

            else if (h->type == 1) {
                printf("\nType %02d - [System Information]\n", h->type);
                printf("\tManufacturer: %s\n", dmi_string(h, p[0x4]));
                printf("\tProduct Name: %s\n", dmi_string(h, p[0x5]));
                printf("\tVersion: %s\n", dmi_string(h, p[0x6]));
                printf("\tSerial Number: %s\n", dmi_string(h, p[0x7]));
                printf("\tUUID: "); dmi_system_uuid(p + 0x8, Smbios->SMBIOSMajorVersion * 0x100 + Smbios->SMBIOSMinorVersion, uuid);
                printf("\tSKU Number: %s\n", dmi_string(h, p[0x19]));
                printf("\tFamily: %s\n", dmi_string(h, p[0x1a]));
            }

            else if (h->type == 2) {
                printf("\nType %02d - [System Information]\n", h->type);
                printf("\tManufacturer: %s\n", dmi_string(h, p[0x4]));
                printf("\tProduct: %s\n", dmi_string(h, p[0x5]));
                printf("\tVersion: %s\n", dmi_string(h, p[0x6]));
                printf("\tSerial Number: %s\n", dmi_string(h, p[0x7]));
                printf("\tAsset Tag: %s\n", dmi_string(h, p[0x8]));
                printf("\tLocation in Chassis: %s\n", dmi_string(h, p[0x0a]));
            }

            else if (h->type == 3) {
                printf("\nType %02d - [System Enclosure or Chassis]\n", h->type);
                printf("\tManufacturer: %s\n", dmi_string(h, p[0x04]));
                printf("\tType: %s\n", dmi_chassis_type(p[0x05]));
                printf("\tVersion: %s\n", dmi_string(h, p[0x06]));
                printf("\tSerial Number: %s\n", dmi_string(h, p[0x07]));
                printf("\tAsset Tag Number: %s\n", dmi_string(h, p[0x08]));
                printf("\tVersion: %s\n", dmi_string(h, p[0x10]));
            }

            else if (h->type == 4) {
                printf("\nType %02d - [Processor Information]\n", h->type);
                printf("\tSocket Designation: %s\n", dmi_string(h, p[0x04]));
                printf("\tProcessor Manufacturer: %s\n", dmi_string(h, p[0x07]));
                printf("\tProcessor Version: %s\n", dmi_string(h, p[0x10]));
                printf("\tVoltage: %d (Bit0 - 5v, Bit1 - 3.3v, Bit2 - 2.9v)\n", p[0x11] & 0x7);

                printf("\tExternal Clock: %d MHz\n", p[0x12] + p[0x13] * 0x100);
                printf("\tMax Speed: %d MHz\n", p[0x14] + p[0x15] * 0x100);
                printf("\tCurrent Speed: %d MHz\n", p[0x16] + p[0x17] * 0x100);
                printf("\tSerial Number: %s\n", dmi_string(h, p[0x20]));
                printf("\tAsset Tag: %s\n", dmi_string(h, p[0x21]));
                printf("\tPart Number: %s\n", dmi_string(h, p[0x22]));
            }

            else if (h->type == 17) {
                if (p[0xc] + p[0xd] * 0x100 == 0)
                    continue;
                printf("\nType %02d - [Memory]\n", h->type);
                printf("\tTotal Width: %d\n", p[0x8]);
                printf("\tData Width:%d\n", p[0xa]);
                printf("\tSize: %d MB\n", p[0xc] + p[0xd] * 0x100);
                printf("\tSpeed: %dMHz\n", p[0x15] + p[0x16] * 0x100);
                printf("\tBank Locator: %s\n", dmi_string(h, p[0x11]));
                printf("\tManufacturer: %s\n", dmi_string(h, p[0x17]));
                printf("\tSerial Number: %s\n", dmi_string(h, p[0x18]));
                printf("\tAsset Tag: %s\n", dmi_string(h, p[0x19]));
                printf("\tPart Number: %s\n", dmi_string(h, p[0x1A]));
            }

            p += h->length;
            while ((*(WORD *)p) != 0) p++;
            p += 2;
        }

        delete[]buf;
        return 0;
    }



    std::string GetUUIDString()
    {
        std::string uuid;
        uuid = "123-abc-plm-!@#";
        GetSystemUUID(uuid);
        return uuid;
    }

    int main(int argc, char* argv[])
    {
    
        GetUUIDString();
        getchar();
        return 0;
    }


  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-11-22 09:19
    关注

    那你最好定义一个全局变量 FILE *fp;
    然后在main中fopen打开文本文件,将各个printf语句改为fprintf就行了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月1日
  • 已采纳回答 11月23日
  • 创建了问题 11月22日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度