.NET 调用 Win32 API

如何在.NET里面调用win32 API 下面是示例在C#里面调用win32api中的 CreateFile 和 CloseHandle 这两个函数。using System;using System.IO;using System.Runtime.InteropServices;namespace copytest{ ///  /// FileAccess 的摘要说明。 ///  public class OpenFileApi 阅读详情

原文地址:http://www.codeproject.com/Articles/9714/Win32-API-C-to-NET

.NET 调用 API 声明格式

VB.NET

Declare Function <Name> Lib <dll name> <Optional fields> (<params>) As <return type>

' Example:
Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA"(_
 ByVal dwFlags As Integer, ByRef lpSource As Object, _
 ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, _
 ByVal lpBuffer As String, ByVal nSize As Integer, _
 ByRef Arguments As Integer) As Integer

C#

[DllImport("<dll name>", <optional fields>)]
static extern <return type> <Method name>(<Params>)[DllImport("kernel32.dll", SetLastError=true)]

// Example:
static extern int FormatMessageA(int dwFlags, 
    ref object lpSource,
    int dwMessageId,
    int dwLanguageId,
    string lpBuffer,
    int nSize,
    ref int Arguments)

Managed C++ .NET

[DllImport("<Dll name>",<optional fields>)] static <return type> <Function name>( <Params>);

// Example:
[DllImport("KERNEL32.DLL",EntryPoint="MoveFileW", SetLastError=true,CharSet=CharSet::Unicode,ExactSpelling=true, CallingConvention=CallingConvention::StdCall)]
static bool MoveFile(String^ src, String^ dst);

数据类型转换表: C++ 到 .NET

类型.NET

C++

ATOM

ushorttypedef WORD ATOM;

BOOL

bool, inttypedef int BOOL;

BOOLEAN

bool, bytetypedef BYTE BOOLEAN;
BYTEbytetypedef unsigned char BYTE;
CALLBACKdelegate#define CALLBACK __stdcall
CHARchartypedef char CHAR;
COLORREFuinttypedef DWORD COLORREF;
CONSTconst#define CONST const
DWORDuinttypedef unsigned long DWORD;
DWORDLONGulongtypedef ULONGLONG DWORDLONG;

DWORD_PTR
DWORD *

uint, IntPtrtypedef ULONG_PTR DWORD_PTR;
DWORD32uinttypedef unsigned int DWORD32;
DWORD64ulongtypedef unsigned __int64 DWORD64;
FLOATsingletypedef float FLOAT;
HACCELIntPtrtypedef HANDLE HACCEL;
HANDLEIntPtrtypedef PVOID HANDLE;
HBITMAPIntPtrtypedef HANDLE HBITMAP;
HBRUSHIntPtrtypedef HANDLE HBRUSH;
HCOLORSPACEIntPtrif(WINVER >= 0x0400)
typedef HANDLE HCOLORSPACE;
HCONVIntPtrtypedef HANDLE HCONV;
HCONVLISTIntPtrtypedef HANDLE HCONVLIST;
HCURSORIntPtrtypedef HICON HCURSOR;
HDCIntPtrtypedef HANDLE HDC;
HDDEDATAIntPtrtypedef HANDLE HDDEDATA;
HDESKIntPtrtypedef HANDLE HDESK;
HDROPIntPtrtypedef HANDLE HDROP;
HDWPIntPtrtypedef HANDLE HDWP;
HENHMETAFILEIntPtrtypedef HANDLE HENHMETAFILE;
HFILEinttypedef int HFILE;
HFONTIntPtrtypedef HANDLE HFONT;
HGDIOBJIntPtrtypedef HANDLE HGDIOBJ;
HGLOBALIntPtrtypedef HANDLE HGLOBAL;
HHOOKIntPtrtypedef HANDLE HHOOK;
HICONIntPtrtypedef HANDLE HICON;
HINSTANCEIntPtrtypedef HANDLE HINSTANCE;
HKEYIntPtrtypedef HANDLE HKEY;
HKLIntPtrtypedef HANDLE HKL;
HLOCALIntPtrtypedef HANDLE HLOCAL;
HMENUIntPtrtypedef HANDLE HMENU;
HMETAFILEIntPtrtypedef HANDLE HMETAFILE;
HMODULEIntPtrtypedef HINSTANCE HMODULE;
HMONITORIntPtr

if(WINVER >= 0x0500)

typedef HANDLE HMONITOR;

HPALETTEIntPtrtypedef HANDLE HPALETTE;
HPENIntPtrtypedef HANDLE HPEN;
HRESULTint, uinttypedef LONG HRESULT;
HRGNIntPtrtypedef HANDLE HRGN;
HRSRCIntPtrtypedef HANDLE HRSRC;
HSZIntPtrtypedef HANDLE HSZ;
HWINSTAIntPtrtypedef HANDLE WINSTA;
HWNDIntPtrtypedef HANDLE HWND;
INTinttypedef int INT;
INT_PTRIntPtr

#if defined(_WIN64)
typedef __int64 INT_PTR;
#else
typedef int INT_PTR;

INT32inttypedef signed int INT32;
INT64longtypedef signed __int64 INT64;
LANGIDushort, inttypedef WORD LANGID;
LCIDuinttypedef DWORD LCID;
LCTYPEuinttypedef DWORD LCTYPE;
LGRPIDuinttypedef DWORD LGRPID;
LONGinttypedef long LONG;
LONGLONGlong

#if !defined(_M_IX86)
typedef __int64 LONGLONG;
#else
typedef double LONGLONG;

LONG_PTRIntPtr

#if defined(_WIN64)
typedef __int64 LONG_PTR;
#else
typedef long LONG_PTR;

LONG32inttypedef signed int LONG32;
LONG64longtypedef __int64 LONG64;
LPARAMIntPtrtypedef LONG_PTR LPARAM;

LPBOOL
Bool *

IntPtr, booltypedef BOOL *LPBOOL;

LPBYTE
Byte *

IntPtr, bytetypedef BYTE *LPBYTE;
LPCOLORREFIntPtr, uinttypedef DWORD *LPCOLORREF;
LPCSTRstring, IntPtr, StringBuildertypedef CONST CHAR *LPCSTR;
LPCTSTRstring, IntPtr, StringBuilder

#ifdef UNICODE
typedef LPCWSTR LPCTSTR;
#else
typedef LPCSTR LPCTSTR;

LPCVOIDIntPtrtypedef CONST void *LPCVOID;
LPCWSTRstring, IntPtr, StringBuildertypedef CONST WCHAR *LPCWSTR;
LPDWORDIntPtr, uinttypedef DWORD *LPDWORD;
LPHANDLEIntPtrtypedef HANDLE *LPHANDLE;
LPINTIntPtr, inttypedef int *LPINT;
LPLONGIntPtr, inttypedef long *LPLONG;
LPSTRstring, IntPtr, StringBuildertypedef CHAR *LPSTR;
LPTSTRstring, IntPtr, StringBuilder

#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;

LPVOIDIntPtrtypedef void *LPVOID;
LPWORDIntPtr, ushorttypedef WORD *LPWORD;
LPWSTRstring, IntPtr, StringBuildertypedef WCHAR *LPWSTR;
LRESULTIntPtr, inttypedef LONG_PTR LRESULT;
PBOOLIntPtr, booltypedef BOOL *PBOOL;
PBOOLEANIntPtr, booltypedef BOOLEAN *PBOOLEAN;
PBYTEIntPtr, bytetypedef BYTE *PBYTE;
PCHARIntPtr, chartypedef CHAR *PCHAR;
PCSTRstring, IntPtr, StringBuildertypedef CONST CHAR *PCSTR;
PCTSTRstring, IntPtr, StringBuilder

#ifdef UNICODE
typedef LPCWSTR PCTSTR;
#else
typedef LPCSTR PCTSTR;

PCWSTRstring, IntPtr, StringBuildertypedef CONST WCHAR *PCWSTR;
PDWORDIntPtr, uinttypedef DWORD *PDWORD;
PDWORDLONGIntPtr, ulongtypedef DWORDLONG *PDWORDLONG;
PDWORD_PTRIntPtr, uinttypedef DWORD_PTR *PDWORD_PTR;
PDWORD32IntPtr, uinttypedef DWORD32 *PDWORD32;
PDWORD64IntPtr, ulongtypedef DWORD64 *PDWORD64;
PFLOATIntPtr, singletypedef FLOAT *PFLOAT;
PHANDLEIntPtrtypedef HANDLE *PHANDLE;
PHKEYIntPtrtypedef HKEY *PHKEY;
PINTIntPtr, inttypedef int *PINT;
PINT_PTRIntPtrtypedef INT_PTR *PINT_PTR;
PINT32IntPtr, inttypedef INT32 *PINT32;
PINT64IntPtr, longtypedef INT64 *PINT64;
PLCIDIntPtr, uinttypedef PDWORD PLCID;
PLONGIntPtr, inttypedef LONG *PLONG;
PLONGLONGIntPtr, longtypedef LONGLONG *PLONGLONG;
PLONG_PTRIntPtr, inttypedef LONG_PTR *PLONG_PTR;
PLONG32IntPtr, inttypedef LONG32 *PLONG32;
PLONG64IntPtr, longtypedef LONG64 *PLONG64;
POINTER_32IntPtr, int

#if defined(_WIN64)
#define POINTER_32 __ptr32
#else
#define POINTER32

POINTER_64IntPtr, long#define POINTER_64 __ptr64
PSHORTIntPtr, shorttypedef SHORT *PSHORT;
PSIZE_TIntPtrtypedef SIZE_T *PSIZE_T;
PSSIZE_TIntPtrtypedef SSIZE_T *PSSIZE_T;
PSTRIntPtr, string, StringBuildertypedef CHAR *PSTR;
PTBYTEIntPtr, chartypedef TBYTE *PTBYTE;
PTCHARIntPtr, string, StringBuildertypedef TCHAR *PTCHAR;
PTSTRIntPtr, string, StringBuilder

#ifdef UNICODE
typedef LPWSTR PTSTR;
#else
typedef LPSTR PTSTR;

PUCHARIntPtr, string, StringBuildertypedef UCHAR *PUCHAR;
PUINTIntPtr, uinttypedef UINT *PUINT;
PUINT_PTRIntPtr, uinttypedef UINT_PTR *PUINT_PTR;
PUINT32IntPtr, uinttypedef UINT32 *PUINT32;
PUINT64IntPtr, ulongtypedef UINT64 *PUINT64;
PULONGIntPtr, uinttypedef ULONG *PULONG;
PULONGLONGIntPtr, ulongtypedef ULONGLONG *PULONGLONG;
PULONG_PTRIntPtr, uint:typedef ULONG_PTR *PULONG_PTR;
PULONG32IntPtr, uinttypedef ULONG32 *PULONG32;
PULONG64IntPtr, ulongtypedef ULONG64 *PULONG64;
PUSHORTIntPtr, ushorttypedef USHORT *PUSHORT;
PVOIDIntPtrtypedef void *PVOID;
PWCHARIntPtr, stringtypedef WCHAR *PWCHAR;
PWORDIntPtr, ushorttypedef WORD *PWORD;
PWSTRIntPtr, string, StringBuildertypedef WCHAR *PWSTR;
SC_HANDLEIntPtrtypedef HANDLE SC_HANDLE;
SC_LOCKIntPtrtypedef LPVOID SC_LOCK;
SERVICE_STATUS_HANDLEIntPtrtypedef HANDLE SERVICE_STATUS_HANDLE;
SHORTshorttypedef short SHORT;
SIZE_Tuint, IntPtrtypedef ULONG_PTR SIZE_T;
SSIZE_Tint, IntPtrtypedef LONG_PTR SSIZE_T;
TBYTEchar

#ifdef UNICODE
typedef WCHAR TBYTE;
#else
typedef unsigned char TBYTE;

TCHARchar

#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;

UCHARchartypedef unsigned char UCHAR;
UINTuinttypedef unsigned int UINT;
UINT_PTRUIntPtr, uint

#if defined(_WIN64)
typedef unsigned __int64 UINT_PTR;
#else
typedef unsigned int UINT_PTR;

UINT32uint

typedef unsigned int UINT32;

UINT64ulong

typedef usigned __int64 UINT64;

ULONGuinttypedef unsigned long ULONG;
ULONGLONGulong

#if !defined(_M_IX86)
typedef unsigned __int64 ULONGLONG;
#else
typedef double ULONGLONG

ULONG_PTRIntPtr, uint

#if defined(_WIN64)
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;

ULONG32uinttypedef unsigned int ULONG32;
ULONG64ulongtypedef unsigned __int64 ULONG64;
USHORTushorttypedef unsigned short USHORT;
USNlongtypedef LONGLONG USN;
VOIDvoid#define VOID void
WCHARchartypedef wchar_t WCHAR;
WINAPI参见 CallingConvention 枚举#define WINAPI __stdcall
WORDushorttypedef unsigned short WORD;
WPARAMIntPtr, uinttypedef UINT_PTR WPARAM;

 

提示

  1. 列表中指向某一类型的指针使用前缀表示,例如: DWORD* = PDWORD
  2. 某些类型(例如: UIntPtr)不兼容 CLS,所以使用了 IntPtr,你可以根据你实际的情况进行选择
  3. 通常在 IDE 中输入“=”号后Intellisense自动弹出的类型是最好的选择
  4. 在 COM Interop 中使用字符串时,应当总是使用 WCHAR*,TCHAR* 等等来作为输入;使用 string 或 StringBuilder 作为输出。当你用一个 IntPtr 通过 Marshal.PtrToStructure() 方法来提取所有字符时会需要递增指针,可以使用 pointer +=Marshal.SizeOf(<last object you got back>);
  5. 有时数据类型并不需要完全一致,譬如 int 可以用来替换 uint
  6. 需要把 IntPtr 转换为 int 或其他类的时候,应使用 Marshal.PtrToStructure() 或 IntPtr 的成员方法
  7. 如果你使用的 API 建立在 ANSI 或 Unicode 的基础上,首先应确保选择了正确的API。参见: CharSet 枚举
  8. 大多数的 API 可以写成托管类型的声明,但某些需要指针,在 C# 中使用 unsafe 关键字你就能使用指针,另外编译时记得带上 /unsafe 开关
  9. 如果想确保 gc 不回收API 调用时使用的 IntPtr,你可以使用 HandleRef 类型
  10. 当需要为API定义一个结构时,确保他们带上 StructLayout.Sequential 属性
  11. 使用 API 方法传入/传出数组时,先确认是一个指向数组的指针还是一个数组对象,如果是指针你需要先把它转成 IntPtr
  12. 列表中多使用 IntPtr 来提取某个类型,有时你可以直接用 ref <datatype> 或 out <datatype>的形式,但是对于char*  你还是要用 IntPr 作为输入,用 ref IntPtr 作为输出
  13. 当你定义的函数无法正常工作,并不一定是你的函数定义写错了,这有可能是传入了错误的数据或其他原因
  14. 仅在必要时使用 Marshal 及 MarshalAs,某些场合下他们消耗较多的处理时间
暴强贴:从.NET平台调用Win32 API 作者:刘铁猛日期:2005-12-20关键字:C# .NET Win32 API版权声明:本文章受知识产权法保护,如果阁下想转载,在转载的时候烦劳阁下连同在下的姓名一起转载,并向bladey@tom.com发一个Mail,我很想知道我的文章都去哪里了.谢谢.小序        Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Program 阅读详情

相关推荐

深入.NET平台调用Win32 API的实践指南

本文深入探讨了.NET环境下如何有效地调用Win32 API,包括字符集设置、调用约定、保留签名、设置最后错误等关键概念。同时,文章详细说明了如何传递结构和类,创建回调函数,并提供了一个跨参考表,帮助开发者在.NET框架中找到相应的Win32 API替代函数。

weixin_42612405的博客 900

老外的一个为VB.NET和VB提供WIN32 API在线查询和用法的站,给VB.NET的朋友推荐下

老外的一个为VB.NET和VB提供WIN32 API在线查询和用法的站,给VB.NET的朋友推荐下 以前用VB做开发的时候有个VB WIN32API手册(window api函数手册),CHM格式的,查起来挺方便的,基本上把每个API的分类都归类好了,查的时候可以从分类找到对应的API函数,也可以通过快速检索,输入前几个API函数字母就能查到,对开发WINDOWS平台下的程序,查询起来还挺方便的,能提高开发效率 现在改用VB.NET开发的时候,虽然.NET框架提供了很强的接口,但有些东西还得需要用原始的Wi

Rock的专栏 6346

VB开发指南 WIN32 API篇

VB开发指南 WIN32 API篇 斯蒂文布朗编写 呵呵 老外就是专业

在C# 中通过 PInvoke 调用Win32 DLL

<br />我在自己最近的编程中注意到一个趋势,正是这个趋势才引出本月的专栏主题。最近,我在基于Microsoft.NETFramework的应用程序中完成了大量的Win32Interop。我并不是要说我的应用程序充满了自定义的interop代码,但有时我会在.NETFramework类库中碰到一些次要但又繁絮、不充分的内容,通过调用该WindowsAPI,可以快速减少这样的麻烦。<br />  因此我认为,.NETFramework1.0或1.1版类库中存在任何Windows所没有的功能*都不足为怪。毕竟

Jaylon Wang的专栏 3531

学习笔记7--激光雷达标定

本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》,笔者不是自动驾驶领域的专家,只是一个在探索自动驾驶路上的小白,此系列丛书尚未阅读完,也是边阅读边总结边思考,欢迎各位小伙伴,各位大牛们在评论区给出建议,帮笔者这个小白挑出错误,谢谢! 此专栏是关于《自动驾驶汽车环境感知》书籍的笔记。 2.激光雷达标定 2.1 概述 激光雷达内参标定:内部激光发射器坐标系与雷达本

FUXI_Willard 8022

【SAP】ABAP——ALV显示后选择数据操作

在ALV显示后,可全选、全不选或者选择几条数据进行发邮件、更新、下单等等操作。 在user_command中的实现方式如下: 方式一: FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield. DATA: lr_grid TYPE REF TO cl_gui_alv_grid. DATA: lt_rows TYPE lvc_t_row WITH

Mona_1220的博客 4090

VB.NET 调用Windows API 使用方法

整理:xiyangshanlu 来源:网络 关键字:Declare,Windows API,Declare Auto,Lib 与 Alias,DllImport   Windows API调用过去曾是Visual Basic编程中很重要的一部分,但在 Visual Basic .NET 几乎不必要了。只要有可能,应该使用 .NET Framework 中的托管代码而不是Windows AP

夕阳山路 1万+

绝对旋转编码器学习笔记(基本原理,与PC通信等,不定期更新中)

前言 最近开始学习编码器相关内容,目的在于搞清楚编码器的原理,与上位机的联系等问题。笔记资料来源为网络,整理的同时也会有一些总结和感悟。由于研究方向需求,主要研究数字旋转编码器。 1.编码器的定义 编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。——摘自《百度百科》 通常来说,编码器可以将角度位移、直线位移、转速等物理量转换为电信号。这里的电信号根据不同原理的编码器输出脉冲、二进制数码等不同的类型,下面会提到。 2.编码器的分类 编.

黑化咸鱼的博客 1万+

.NET平台调用Win32 API

此为转贴,感谢原创作者的为人民服务的精神,致礼! 作者:刘铁猛日期:2005-12-20关键字:C# .NET Win32 API 版权声明:本文章受知识产权法保护,如果阁下想转载,在转载的时候烦劳阁下连同在下的姓名一起转载,并向bladey@tom.com发一个Mail,我很想知道我的文章都去哪里了.谢谢. 小序 Win32 API可以直接控制Micros...

aofmkrl6423的博客 136

云端办公文件存储与访问全攻略:选型、预算、实操一本通

随着远程办公、多设备协作成为常态,“文件云端存储、随时调用” 已成为提升办公效率的核心需求。本文从用户实际场景出发,系统拆解云端存储的选型逻辑、全场景费用预算,重点解答 “文件能否直接在线打开” 的核心疑问,并提供实操技巧与安全保障方案,覆盖个人、小团队(含兼职)、企业全维度需求,帮助不同规模用户快速搭建高效、低成本的云端办公体系。

hy行者勇哥的博客 1240

电子技术课程设计:声音音量峰值检测显示系统设计

本文介绍了声音音量峰值检测显示系统的设计方案。系统采用分立元件设计,不使用单片机和集成运放,包含电源模块、声音采集放大电路、峰值检测保持模块、比较器、A/D转换及显示控制等部分。麦克风信号经两级晶体管放大后,通过二极管-电容电路检测峰值并保持,再经A/D转换显示为数字值(0000-9999)。系统采用9V电池供电,包含启动/清除控制功能,能指示声音过低或过高状态。详细阐述了各模块电路设计、参数计算和仿真验证,并提供了完整的原理图和PCB布线方案。该系统实现了声音峰值电压的准确检测与数字显示功能。

huanghm88的专栏 254

从.NET平台调用Win32 API

作者:刘铁猛日期:2005-12-20关键字:C# .NET Win32 API版权声明:本文章受知识产权法保护,如果阁下想转载,在转载的时候烦劳阁下连同在下的姓名一起转载,并向bladey@tom.com发一个Mail,我很想知道我的文章都去哪里了.谢谢. 小序        Win32 API可以直接控制Microsoft Windows的核心,因为API(Application

500ML的专栏 1370

把 ABAP 经验装进 GitHub Copilot 的按需大脑,Agent Skills 如何改变 ABAP 开发

2026 年 8 月,SAP Community 上出现了一次很有代表性的 ABAP 实验。开发者把标准 Flight Model 里的复制成自己的测试类,删除原有 ABAP Unit Test,再让 GitHub Copilot Agent 为方法重新生成测试代码。真正有意思的地方并不是 Copilot 会不会写,而是开发者给 Copilot 准备了两个专门的 Agent Skills,一个负责 ABAP Unit Test 的通用规则,一个负责 ABAP Test Double Framework。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 151

C#【高级篇】.NET平台调用Win32 API

.NET平台调用Win32 API

星Yeah 的博客 6251

励磁电感 Lm 选对了,LLC 才真“高效”:半桥 LLC 效率优化

你有没有遇到过这种 LLC:参数一套下来,ZVS 也有了,波形看着也“挺谐振”,但一上功率——,效率就是死活上不去。我说句直白的:LLC 的“高效”,很大一部分其实是在背后控场。Lm 选小了,励磁电流蹭蹭涨,谐振电流 RMS 变大,导通损耗、开关损耗、整流损耗一起上天;Lm 选太大,又可能把 ZVS 的门槛抬高,轻载掉 ZVS,EMI 也开始作妖。

weixin_43199439的博客 434

HQChart实战教程19 - PC端分时图定制tooltip

HQChart实战教程19 - PC端分时图定制tooltip序效果步骤1. 创建一个外部tooltip的div2. 注册标题绘制事件3. 标题绘制回调函数格式说明eventdataobjtooltip显示函数HQChart代码地址 序 hqchart分时图是不带tooltip, 如果我们需要在PC端页面显示tooltip,我们可以通过注册绘制标题事件,来自己做一个div显示数据。 参考教程HQChart实战教程7-自定义显示手势点击K线显示信息 效果 步骤 1. 创建一个外部tooltip的div 在外

小银 2447

P/Invoke .NET调用win32API

项目:无线无源测温软件系统 项目中,用到使用P/Invoke在.NET调用win32API,实现对ini配置文件的读写功能!因为有一些配置信息需要保存下来,以便在下一次启动程序完成初始化,这实际上是一种类持久化。将 一些信息写入INI文件(initialization file)中,可完成简单的持久化支持。 Windo...

weixin_30609331的博客 61

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: CLR via C# 读书笔记目录
下一篇: .NET Reflection optimization 反射优化
sqlchen
博客等级 码龄24年 10粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值