如何使用 cl 编译 Window API 程序?

2023-11-27

我正在尝试使用 Windows SDK 命令提示符编译一个简单的 C Windows API 程序。

以下是该计划的摘录:

#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

[...]

    RegisterClass(&wc);
    hwnd = CreateWindow("test", NULL, 0, 0, 0, 0, 0, NULL, NULL, hInstance, NULL);

[...]

当我使用它编译时

cl test.c

在 Windows SDK 命令提示符中,它给了我很多链接器错误,如下所示:

test.obj : error LNK2019: unresolved external symbol __imp_CreateWindowExA referenced in function WinMain
test.obj : error LNK2019: unresolved external symbol __imp_RegisterClassA referenced in function WinMain

至少有两个问题。

  1. 链接器告诉您有一个“未解析的外部符号”。这意味着它找不到您尝试调用的函数的定义。在这种情况下,有两个这样的未定义函数:CreateWindowExA and RegisterClassA.

    显然,这些函数的定义不是在您的代码中找到,而是在 Windows API 库中找到,因此您需要通知链接器在哪里可以找到这些定义。

    SDK 附带存根 (*.lib) 文件,其中包含链接器使用的信息,以便链接器可以在运行时在 Windows DLL 中找到正确的函数定义。您需要指示链接器在哪里可以找到这些*.lib files.

    有几种不同的策略可以做到这一点:

    1. 简单(尽管不可移植)的方法是插入#pragma语句到源文件中,指示编译器留下链接器识别的注释。例如,

      #pragma comment(lib, "user32")
      

      自动链接到user32.lib,这是存根文件user32.dll.

    2. 或者,您可以将命令行上的参数传递给cl.exe。但是,如果您不使用 MSBuild 或某种 make 文件,那么这很快就会变得非常复杂。在这种情况下,您需要将命令行修改为(至少):

      cl test.c user32.lib
      

    这两个选项自然假设您的 Windows SDK 目录已添加到路径中。我很确定安装程序会自动为您完成此操作,但我并不肯定。如果没有,或者您已从路径中删除了这些文件,则需要使用完全限定的路径*.lib命令行上的文件。

    Reading 可能的编译器选项的文档是一个很好的起点。或者更好的是,如果您不熟悉 Windows 编程,可以使用 Visual Studio 等环境来自动将所有这些内容组合在一起。一旦您了解了发生了什么,就可以查看 Visual Studio 运行的命令行是什么,并一点一点地剖析它。

  2. 下一个问题是你正在编译withoutUnicode 定义的,并且因为ANSI 是默认值,Windows 头文件中的所有宏都解析为调用A所有 SDK 功能的后缀版本。这可能不是您想要的。 Windows 完全采用 Unicode 已经有十多年了,所有新应用程序都应该构建为 Unicode。 Unicode 版本有一个W后缀附加到他们的名字上。

    同样,您可以通过向源文件添加行或向命令行添加参数来显式指示编译器使用 Unicode 进行构建。

    在这种情况下,最简单的方法可能就是添加

     #define UNICODE
    

    到源文件的顶部before #include <windows.h>。正如我们在上面看到的,在 Visual Studio 环境中,UNICODE除非您明确更改项目设置以瞄准其他目标,否则会自动为您定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 cl 编译 Window API 程序? 的相关文章

  • 如何通过之前编写的预处理器定义获取函数签名?

    我想创建一个定义来解析函数签名并使用 Boost Preprocessor 创建如下内容 MY DEFINE std string fun int t float b 或者至少 MY DEFINE std string fun int t
  • 未排序模式的 boost::Spirit 语法

    我有一个需要解析的模型模式的一部分 可以说它看起来像下面这样 type Standard hostname x y z port 123 属性是 元素可能看起来无序 属于架构一部分的所有元素都必须出现 而不是其他元素 所有元素的综合属性都进
  • 以编程方式从 java 代码中查找 java.exe 的绝对路径

    如果我有一个由用户启动的 java jar 或类文件 假设在环境变量中设置了 java 路径 那么我如何从代码中找出 java exe javaw exe 的绝对路径文件正在启动 就像在 ubuntu 上一样 我们可以运行 which ja
  • Unity 检查 Toggle 是否打开

    我正在检查开关是否打开 通常我使用public Toggle myToggle在检查器中 但这我将脚本附加到Toggle并且可能错误地使用GetComponent
  • 为什么静态方法不能用作 ASMX Web 服务中的 Web 服务操作?

    我只是想了解为什么我不能在 Web 服务中使用静态 Web 方法 为什么会受到限制 有人可以给我对此进行简洁的解释吗 答案是 因为你不能 它不是这样设计的 其设计是 将创建 Web 服务类的实例 然后调用实例方法 我只能猜测微软为什么这样设
  • 在控制台应用程序中使用 SendGrid

    是否可以在 C 的控制台应用程序中使用发送网格 我的代码不起作用 我真的不知道为什么 你可以帮帮我吗 using System using System Net using System Net Mail using SendGrid na
  • 用 while 循环打开文件 - C [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 各位程序员大家好 我的问题不大 我不知道如何打开具有不同数字 在文件名中 的文件 从 1 到存在的任意数量的文件 例如 我有两个 或最
  • 如何在使用连接池时强制 SqlConnection 物理关闭?

    我明白 如果我实例化一个 SqlConnection 对象 我实际上是从连接池中获取一个连接 当我调用 Open 时 它将打开连接 如果我对该 SqlConnection 对象调用 Close 或 Dispose 方法 它将返回到连接池 但
  • 使用 AJAX 加载部分视图不起作用

    请原谅我 我是 MVC 和 AJAX 的新手 目前我只是提交一个表单 我想使用表单中的数据使用 ajax 更新部分视图中的表 My UserInfo部分视图如下所示 model IEnumerable
  • 如何使用Boost.Asio C++? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我会尝试使用该库在多个平台上使用套接字 Boost Asio c 我在这里下载了最新版本 http sourceforge net p
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • 在 OpenGL 中设置 MVP 矩阵

    我正在尝试学习 OpenGL 的基础知识 但我在设置变换矩阵时遇到问题 我制作了模型 视图和投影矩阵 但将它们发送到我的顶点着色器时遇到问题 这是代码 Set up MVP glm mat4 model glm mat4 GLint uni
  • 如何将 MemoryStream 写入 byte[] [重复]

    这个问题在这里已经有答案了 可能的重复 从流创建字节数组 https stackoverflow com questions 221925 creating a byte array from a stream 我正在尝试在内存中创建文本文
  • 为什么我无法在 WebView (UWP) 中打开外部浏览器中的链接?

    我正在开发一个即将完成的 Web 应用程序 该应用程序有一个本地 Web 应用程序 其中有一些链接 我想在外部浏览器 Edge Chrome 等 中打开它们 我的代码分为 3 部分 1 Windows运行时组件 using System u
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • CompileAssemblyFromDom 抛出访问被拒绝异常

    代码 using var codeProvider new CSharpCodeProvider var compilerParameter new CompilerParameters assemblies assemblyName fa
  • 如何在C中读取和分配大整数?

    我试图将大整数值分配给 c 中的变量 当我打印时 我只得到 10123456 问题是什么 int main long a 1234567890123456 printf n sizeof a printf ld a 最大的整数类型是 uns
  • 使用实体框架重叠约会

    我将 asp net mvc 与实体框架一起使用 我有一个包含 startat 字段 endat 字段和 roomid 字段 称为 SpaceConfigurationId 的约会列表 并且希望查找给定房间已重复预订的约会列表 可以假设 e
  • 更改鼠标悬停时的矩形背景

    所以我有一个没有背景的矩形 当用户将鼠标悬停在其上时 我想给它一个背景渐变 然后当鼠标离开矩形时删除渐变 请有人发布所需的代码 并告诉我将其放在 cs xaml 文件中的位置吗 Thanks This
  • 检查给定字符串是否等于给定字符串集中的至少一个字符串的有效方法

    给定一组字符串 比如说 String1 String2 StringN C 中确定最有效的方法是什么 返回true or false 是否给定string s匹配上面集合中的任何字符串吗 Boost Regex 可以用于此任务吗 std u

随机推荐

  • 使用elasticsearch-dsl的delete方法时版本冲突

    因此 我们在 Django 项目中使用elasticsearch 并且使用elasticsearch dsl python 库 我们在生产中遇到以下错误 ConflictError 409 took 7 timed out false to
  • ASP.Net MVC 中的自我 AJAX 更新部分视图/控制器和复制 div

    我对 MVC 的部分看法如下 div div 在该 div 内有一个表单 它使用 AJAX 调用控制器并返回相同的部分视图 问题是调用视图的结果替换了 div 的内容 而不是整个 div 我最终得到 div div div div 根据我一
  • 真(非伪)随机数生成器。外面有什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在寻找能够生成真实随机数的经济实惠的解决方案 我已经发现LavaRnd 这是一个密码学上合理的随机数生成器 有人有这个领域的经验和 或了解其他解决方案吗 PS 恕我直言 这个问题
  • API 获取和浏览器崩溃后 Swagger UI 冻结

    我有一个 ASP NET WebAPI 项目 我试图用 Swagger UI 替换旧的 XmlDocumentationProvider 页面 我正在使用webAPI 5 3 1 的 swashbuckle swagger努吉特包 我能够导
  • 如何创建非持久性 EJB 3.1 计时器?

    使用 NetBeans 7 1 GlassFish 3 1 我创建了一个新的 TimerSessionBean Stateless public class NewTimerSessionBean implements NewTimerSe
  • 如何计算孩子的数量?

    我有一个清单 ul li li li li li li ul 我需要 jQuery 来计算列表中的项目数 您可以使用 length 像这样 var count ul li length length告诉选择器找到了多少个匹配项 因此这会计算
  • 更新 mongodb 中的嵌套数组

    我在 mongodb 中有一个文档 其中包含需要更新的 2 级深度嵌套对象数组 如下所示 id 1 items id 2 blocks id 3 txt hello 如果只有一层深数组 我可以使用位置运算符来更新其中的对象 但对于第二层 我
  • Google App Engine 标准环境还是灵活环境?

    我陷入了选择 Google App Engine Standard 和 Google App Engine Standard 之间的抉择 适合现实世界生产的灵活环境 我肯定想使用Java 需要使用Firebase 最新版本 进行身份验证和推
  • 为子字符串搜索建立索引?

    我想在数十亿个字符串中进行常规子字符串搜索 这个要求与一般的全文搜索有点不同 因为我希望查询 ubst 也可以点击 substr Lucene 或 Sphinx 能够做到这一点吗 如果没有 您认为最好的方法是什么 这种情况下的最佳索引结构是
  • iOS 和 Android 共享 HTTP 深度链接?

    我正在尝试通过 URL 通过电子邮件等共享 启动我的本机应用程序 Android 似乎只响应 HTTP 深层链接 URL 例如 http myapp com stuff 并且 iOS 仅响应非 HTTP 自定义深层链接 URL 例如 mya
  • SPA - Firebase 和 .Net WebApi 2 身份验证

    我有一个用 AngularJs 编写的单页应用程序 此时框架无关紧要 该应用程序托管在 IIS 中 它由 index html 和一堆客户端资产组成 在后端 我有 WebApi 2 它也作为单独的应用程序托管在 IIS 中 对于客户端身份验
  • 不安全的 JavaScript 尝试通过 URL 访问框架

    我已将 Vimeo 合并到我正在构建的 WordPress 主题中 但出现以下错误 不安全的 JavaScript 尝试通过 URL 访问框架http themes ibrogram com beta blog 来自带有 URL 的框架ht
  • 停止在 jqgrid 中调整列大小

    如何使 jqgrid 的所有列不可调整大小 目前我认为每一列都必须指定属性 ressized false 我可以为整个网格指定吗 从版本 3 8 2 开始 jqGrid 支持一项非常有用的功能 栏模板 我赞扬该功能可能不太正确 因为该功能是
  • 当浏览器重新加载/返回时,如何防止数据库被再次写入?

    我正在编写一个小型 Web 应用程序 用于写入数据库 Perl CGI 和 MySQL CGI 脚本从表单中获取一些信息并将其写入数据库 然而 我注意到 如果我在网络浏览器上点击 重新加载 或 返回 它会再次将数据写入数据库 我不想要这个
  • Rails 返回:[BUG] 分段错误

    如果我跑rails s I get Users adam rvm gems ruby 1 9 3 p327 gems pg 0 13 2 lib pg ext bundle BUG Segmentation fault ruby 1 8 7
  • Java - 将小写转换为大写而不使用 toUppercase()

    我正在尝试创建一个简短的程序 将所有大写字母转换为小写字母 从命令行输入 以下编译但没有给出我期望的结果 这会是什么原因呢 例如 java toLowerCase BANaNa gt 给出香蕉的输出 public class toLower
  • VS2010 抛出“无法复制文件“obj\x86\Debug\[file].exe”,因为找不到该文件。”

    我正在编写一个 Windows Phone 8 游戏 需要许多支持桌面应用程序 关卡编辑器等 由于我只有 VS 的 Express 版本 因此我使用 2010 for Windows Phone 来创建这些游戏 2012 不提供创建 Win
  • 创建零填充 JavaScript 数组的最有效方法?

    在 JavaScript 中创建任意长度的零填充数组的最有效方法是什么 ES6引入Array prototype fill 它可以这样使用 new Array len fill 0 不确定它是否很快 但我喜欢它 因为它很短并且具有自我描述性
  • Python内存模型

    我有一个很大的清单 假设我这样做 是的 我知道代码非常不Python 但为了示例 n 2 32 2 for i in xrange 10 7 li i n 工作正常 然而 for i in xrange 10 7 li i i 2 消耗大量
  • 如何使用 cl 编译 Window API 程序?

    我正在尝试使用 Windows SDK 命令提示符编译一个简单的 C Windows API 程序 以下是该计划的摘录 include