C语言:gcc 如何调用 Win32 打开文件对话框 ?

在 Windows 平台上使用 gcc 调用原生 Win32 API 实现文件打开对话框是可行的,但需要直接使用 Win32 的 GetOpenFileName 函数(位于 commdlg.h 头文件,依赖 comdlg32.lib 库)。以下是完整实现步骤和代码示例:
编写 filedialog.c  如下

#include <windows.h>
#include <commdlg.h>// 定义文件选择对话框的过滤器(示例:文本文件和所有文件)
const char filter[] = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";// 打开文件对话框函数
char* OpenFileDialog(HWND hwnd) {OPENFILENAMEA ofn;char szFile[260] = {0};ZeroMemory(&ofn, sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = hwnd;ofn.lpstrFile = szFile;ofn.nMaxFile = sizeof(szFile);ofn.lpstrFilter = filter;ofn.nFilterIndex = 1;ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;if (GetOpenFileNameA(&ofn)) {return strdup(ofn.lpstrFile); // 返回选择的文件路径}return NULL;
}// 主函数(示例)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {char* filePath = OpenFileDialog(NULL);if (filePath) {MessageBoxA(NULL, filePath, "Selected File", MB_OK);free(filePath);}return 0;
}

2. 编译命令

由于 gcc 在 Windows 上默认不包含完整的 Win32 SDK 路径,需手动指定头文件和库路径。
编写 win_gcc.bat  如下

SET INCLUDE=D:\Strawberry\c\include;D:\Strawberry\c\x86_64-w64-mingw32\include
SET LIB=D:\Strawberry\c\x86_64-w64-mingw32\lib
gcc -o filedialog.exe filedialog.c -lcomdlg32 -lgdi32 -luser32

关键参数

  • -I<路径>:指定 Windows API 头文件路径(如 MinGW 的 include 目录)。

  • -L<路径>:指定库文件路径(如 MinGW 的 lib 目录)。

  • -lcomdlg32:链接通用对话框库(GetOpenFileName 依赖)。

  • -lgdi32 和 -luser32:基础 GUI 库(窗口和消息处理)。

3. 运行依赖

  • 编译后的 filedialog.exe 需要以下动态链接库(DLL):

    • comdlg32.dll(通用对话框库,通常位于系统目录)。

    • gdi32.dll 和 user32.dll(基础 GUI 库)。

4. 注意事项

  1. UNICODE 支持

    • 若需支持 Unicode,改用 GetOpenFileNameW 并调整字符类型为 wchar_t,但 TCC 对宽字符支持有限,建议使用 ANSI 版本(GetOpenFileNameA)。

  2. 内存管理

    • 使用 strdup 复制返回的字符串后,需手动调用 free 释放内存。

  3. 路径分隔符

    • Windows 路径使用反斜杠 \,但代码中需用 \\ 转义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM时间序列预测(完整源码和数据)

EMD-SSA-VMD-LSTM混合模型 一、环境配置与依赖二、数据生成&#xff08;示例数据&#xff09;三、多级信号分解1. 经验模态分解&#xff08;EMD&#xff09;2. 奇异谱分析&#xff08;SSA&#xff09;3. 变分模态分解&#xff08;VMD&#xff09; 四、数据预处理1. 归一化处理2…

vue配置子路由,实现点击左侧菜单,内容区域显示不同的内容

文章目录 一、路由链路二、实现步骤准备二级路由下的.vue文件配置子路由声明router-view标签为菜单项 el-menu-item 设置index属性&#xff0c;设置点击后的路由路径 三、参考资料 一、路由链路 二、实现步骤 准备二级路由下的.vue文件 配置子路由 router/index.js import {…

ModuleNotFoundError: No module named ‘SDToolbox‘

(py311) C:>python Python 3.11.11 | packaged by Anaconda, Inc. | (main, Dec 11 2024, 16:34:19) [MSC v.1929 64 bit (AMD64)] on win32 Type “help”, “copyright”, “credits” or “license” for more information. from SDToolbox import PostShock_eq Tracebac…

Hi3516DV500刷写固件

hi3516DV500刷固件 1、硬件连接 2、软件准备 3、刷固件步骤 一、硬件连接 特别注意的是&#xff0c;串口的接线顺序 通过网线连接好笔记本和开发板后&#xff0c;需要确认一下网口水晶头是否闪烁&#xff0c;以确认网络物理是否连通 二、软件资源准备 固件包准备 打开工具…

正则表达式r前缀使用指南

正则表达式中的 r&#xff1a;解锁字符串转义的魔法 正则表达式是处理字符串的强大工具&#xff0c;但它常常伴随着转义字符的复杂性。如果你曾因 \n、\t 或 \\ 的使用而困惑&#xff0c;那么这篇文章将为你揭开谜底&#xff0c;解释为什么 r 是正则表达式中的「神奇武器」。本…

网络攻防模拟:城市安全 “数字预演”

在当今数字化快速发展的时代&#xff0c;网络安全和城市安全面临着前所未有的挑战。为有效应对这些挑战&#xff0c;利用先进的技术搭建模拟演练平台至关重要。图扑软件的 HT for Web 技术&#xff0c;为网络攻防模拟与城市安全演练提供了全面且高效的解决方案。 三维场景搭建&…

AI模型开发全流程笔记

一、训练数据准备阶段 数据采集标准 格式要求&#xff1a;严格QA对形式&#xff08;1问1答&#xff09; 数量基准&#xff1a; 基础量&#xff1a;500组QA对 优化量&#xff1a;800-1000组QA对 内容规范&#xff1a; 聚焦单一业务节点&#xff08;如售后场景&#xff09; …

1688 数据接口调用秘籍:高效获取商品实时信息的开发指南

在电商行业竞争白热化的当下&#xff0c;企业想要抢占市场先机&#xff0c;实时掌握商品信息至关重要。作为国内 B2B 电商巨头&#xff0c;1688 平台汇聚海量商品资源&#xff0c;通过高效调用其数据接口获取商品实时信息&#xff0c;能为企业价格策略制定、库存管理、竞品分析…

milvus学习笔记

本文主要由AI生成&#xff0c;请注意自己查看源代码校验。 Milvus v2.4 系统架构概览 Milvus 采用分布式微服务架构&#xff0c;将计算层&#xff08;Proxy、QueryCoord、QueryNode、IndexCoord、DataCoord、DataNode 等&#xff09;与存储层&#xff08;Pulsar、MinIO/S3、e…

使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线

以下通过点亮LED进行基本使用流程演示&#xff0c;实际可以连接复杂外设&#xff08;SPI、CAN、ADC等&#xff09; 单模块使用 RX、TX、5V和GND接到串口模块&#xff1b;X5接5V&#xff1b;Y2接LED;LED-接GND 串口模块插上电脑后&#xff0c;LED没有亮&#xff1b;因为此时模…

HarmonyOS NEXT~鸿蒙应用上架指南:HarmonyOS应用发布全流程解析

HarmonyOS NEXT&#xff5e;鸿蒙应用上架指南&#xff1a;HarmonyOS应用发布全流程解析 引言 随着华为鸿蒙操作系统(HarmonyOS)生态的快速发展&#xff0c;越来越多的开发者希望将自己的应用上架到鸿蒙应用市场。本文将详细介绍鸿蒙应用上架的全流程&#xff0c;帮助开发者顺…

20250517 我设想一个空间,无限大,空间不与其中物质进行任何作用,甚至这个空间能容纳可以伸缩的空间

1.我设想一个空间&#xff0c;无限大&#xff0c;空间不与其中物质进行任何作用&#xff0c;甚至这个空间能容纳可以伸缩的空间 您设想的这个空间具有一些有趣的特点&#xff1a; 无限大&#xff1a;空间本身没有边界或限制&#xff0c;理论上可以容纳无限多的物质或结构。非…

使用 Kaniko来构建镜像

使用 Kaniko来构建镜像 Kaniko 是一种专注于容器镜像构建的开源工具&#xff0c;其核心设计理念与 Docker 存在显著差异。以下从功能定位、技术实现和适用场景三方面进行对比分析&#xff1a; 一、Kaniko 的核心特性 无需 Docker 守护进程 Kaniko 直接在容器或 Kubernetes 集…

webman用nginx代理静态json文件的异步跨域

场景 有.json文件置于webman的public目录下&#xff0c;使用了nginx做代理&#xff0c;直接访问文件是可以正常加载的&#xff0c;但跨域浏览器就无法加载文件。 nginx配置 文件是否存在于跟目录&#xff0c;存在则设置请求头&#xff0c;不存在则将请求交给webman处理即可。…

JDK 21新特性全面解析

Java Development Kit (JDK) 21作为Oracle长期支持(LTS)版本&#xff0c;于2023年9月正式发布&#xff0c;带来了多项令人振奋的新特性和改进。本文将全面介绍JDK 21中的主要更新&#xff0c;帮助开发者了解如何利用这些新功能提升开发效率和代码质量。 一、虚拟线程(Virtual …

如何选择高性价比的 1T 服务器租用服务​

选择高性价比的 1T 服务器租用服务​&#xff0c;可参考以下内容&#xff1a; 1、根据需求选配置​ 明确自身业务需求是关键。若为小型网站或轻量级应用&#xff0c;数据存储与处理需求不高&#xff0c;选择基础配置服务器即可。如个人博客网站&#xff0c;普通的 Intel Xeon …

JavaScript性能优化实战(11):前沿技术在性能优化中的应用

引言 随着Web应用复杂度和性能需求不断提高,传统的JavaScript优化技术已经无法满足某些高性能计算场景的需求。本文将深入探讨前沿Web技术如何突破JavaScript的性能瓶颈,为Web应用提供接近原生应用的性能体验。从底层计算到图形渲染,从并发处理到动画优化,我们将通过实际案…

package.json 和 package-lock.json 的区别

package.json​​ ​​作用​​ ​​声明项目元数据​​&#xff1a;如项目名称、版本、描述、入口文件等。​​定义依赖范围​​&#xff1a;在 dependencies 和 devDependencies 中声明项目​​直接依赖​​的包及其​​版本范围​​&#xff08;如 ^1.2.3&#xff09;。​​…

Rollup入门与进阶:为现代Web应用构建超小的打包文件

我们常常面临Webpack复杂配置或是Babel转译后的冗余代码&#xff0c;结果导致最终的包体积居高不下加载速度也变得异常缓慢&#xff0c;而在众多打包工具中Rollup作为一个轻量且高效的选择&#xff0c;正悄然改变着这一切&#xff0c;本文将带你深入了解这个令人惊艳的打包工具…

基于C#的MQTT通信实战:从EMQX搭建到发布订阅全解析

MQTT(Message Queueing Telemetry Transport) 消息队列遥测传输&#xff0c;在物联网领域应用的很广泛&#xff0c;它是基于Publish/Subscribe模式&#xff0c;具有简单易用&#xff0c;支持QoS&#xff0c;传输效率高的特点。 它被设计用于低带宽&#xff0c;不稳定或高延迟的…