V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zycpp
V2EX  ›  程序员

还有比 winapi 更丑的 api 吗?

  •  
  •   zycpp · 2019-03-25 09:36:53 +08:00 via iPhone · 8515 次点击
    这是一个创建于 2072 天前的主题,其中的信息可能已经有所发展或是发生改变。
    迫生,在 Windows 上做 c 艹开发,被 winapi 折磨的死去活来,好奇还有比这更烂更丑的 API 吗?
    开发语言不限…
    想开个眼界
    57 条回复    2019-03-27 10:32:25 +08:00
    huruwo
        1
    huruwo  
       2019-03-25 09:40:50 +08:00
    年轻
    ZavierXu
        2
    ZavierXu  
       2019-03-25 09:42:15 +08:00
    你要不看看 unix 的 api ……
    python35
        3
    python35  
       2019-03-25 09:43:22 +08:00   ❤️ 11
    能调 API 已经很爽了 我见过在 linux 层写设备驱动的和连 linux 都没有的情况下开天辟地写驱动的
    hjc4869
        4
    hjc4869  
       2019-03-25 09:43:36 +08:00   ❤️ 3
    creat
    tcjj3
        5
    tcjj3  
       2019-03-25 09:45:28 +08:00 via Android
    汇编或者二进制编码了解一下
    whoami9894
        6
    whoami9894  
       2019-03-25 09:54:51 +08:00 via Android   ❤️ 3
    @tcjj3
    你不觉得你在答非所问吗
    Ediacaran
        7
    Ediacaran  
       2019-03-25 09:56:32 +08:00 via iPhone
    Symbian ?
    Nasei
        8
    Nasei  
       2019-03-25 10:05:47 +08:00 via Android
    命名上可能不太对我口味,HWND LPARAM 看着就丑,其他方面我没觉得 unix 系的好多少…因为系统级编程两边经验都不多,所以都是写的时候现查手册…
    orangeade
        9
    orangeade  
       2019-03-25 10:09:15 +08:00 via Android
    tensorflow ?
    xiusedelang
        10
    xiusedelang  
       2019-03-25 10:11:52 +08:00
    @Ediacaran Symbian +1
    geelaw
        11
    geelaw  
       2019-03-25 10:15:33 +08:00   ❤️ 2
    楼主的吐槽对象不明确,你想说 NT API 还是 Win32 还是 COM 还是 WinRT 还是 POSIX ?(是的,Windows 曾经支持 POSIX。)

    实际上楼主需要摆脱“一切都很简单”的想法,完整表达一个概念有一个内蕴的复杂度。

    @Nasei #8 实际上 HWND、LPARAM 都是图形界面编程才用得到的 API,Unix 系根本没有等价的。
    zycpp
        12
    zycpp  
    OP
       2019-03-25 10:22:33 +08:00 via iPhone
    @geelaw 主要用 win32 和 com,丑是关键,看着难受…
    msg7086
        13
    msg7086  
       2019-03-25 10:25:15 +08:00 via Android
    年代有点久远了吧,放在 20 年前我觉得还行?
    xdeng
        14
    xdeng  
       2019-03-25 10:27:32 +08:00
    这是引战?
    Nasei
        15
    Nasei  
       2019-03-25 10:29:23 +08:00 via Android
    @geelaw 仅是指的命名…因为我是从 posix api 那边开始接触的,所以后来接触 win32 api 的时候就先入为主了
    murmur
        16
    murmur  
       2019-03-25 10:32:03 +08:00   ❤️ 1
    api 丑架不住 ide 牛批
    anyele
        17
    anyele  
       2019-03-25 10:35:16 +08:00
    在学校的时候, 一开始学 MFC 感觉 API 写的很好啊
    abelmakihara
        18
    abelmakihara  
       2019-03-25 10:38:25 +08:00
    @anyele #17 当年在学校就被 MFC 还有 ssh 当年的一堆 xml 劝退了 害怕
    Removable
        19
    Removable  
       2019-03-25 10:38:50 +08:00
    @Ediacaran @xiusedelang 哇,感觉给塞班写过 app 的都是大佬啊
    tomychen
        20
    tomychen  
       2019-03-25 10:39:02 +08:00
    你到底是为了喷 WINAPI 还是为了喷 windows
    能不能举个栗子?来证明又烂又丑?
    Alexinder
        21
    Alexinder  
       2019-03-25 10:41:42 +08:00
    arcgis 不过好像不丑
    anyele
        22
    anyele  
       2019-03-25 10:42:57 +08:00   ❤️ 3
    @abelmakihara #17 在学校学 Java 我是被 Eclipse 和 XML 劝退的, 因为有 VS 先入为主, 觉得 Eclipse 是什么辣鸡玩意,直到后面接触了 IDEA 才算是入了 Java 的坑。 当时还背过从 WinMain 函数,注册窗口,创建窗口,消息循环函数这一堆流程和代码
    tabris17
        23
    tabris17  
       2019-03-25 10:44:25 +08:00   ❤️ 1
    windows API 是有历史包袱的,毕竟是从 win1.0 时代继承的祖传接口。能维护成这样已经非常不容易了
    zycpp
        24
    zycpp  
    OP
       2019-03-25 10:45:18 +08:00 via iPhone
    @tomychen
    _Check_return_ WINOLEAPI
    CoInitializeSecurity(
    _In_opt_ PSECURITY_DESCRIPTOR pSecDesc,
    _In_ LONG cAuthSvc,
    _In_reads_opt_(cAuthSvc) SOLE_AUTHENTICATION_SERVICE* asAuthSvc,
    _In_opt_ void* pReserved1,
    _In_ DWORD dwAuthnLevel,
    _In_ DWORD dwImpLevel,
    _In_opt_ void* pAuthList,
    _In_ DWORD dwCapabilities,
    _In_opt_ void* pReserved3
    );

    (手动狗头
    widewing
        25
    widewing  
       2019-03-25 11:08:21 +08:00 via Android
    @zycpp 这不写的挺好的吗?你是想说那些宏吗?
    ArchVile
        26
    ArchVile  
       2019-03-25 11:09:38 +08:00   ❤️ 1
    Windows Api 的文档微软算是做的很不错的了。
    tomychen
        27
    tomychen  
       2019-03-25 11:15:13 +08:00   ❤️ 1
    @zycpp
    你这是要对比 stl 还是要对比 objc?
    老实说 WINAPI 相比众多 API 而言,已经算是很友好了,至少从命名上已经能估到作用,再加上 MSDN,也算是对 dever 相对友好了吧

    君不如埋头看看 Obj-c 的 API 和文档,知足吧。
    kristpan
        28
    kristpan  
       2019-03-25 11:23:14 +08:00 via Android
    @ZavierXu 我觉得 Unix 的 API 相当优雅呀
    GeruzoniAnsasu
        29
    GeruzoniAnsasu  
       2019-03-25 11:45:05 +08:00   ❤️ 7
    @kristpan
    unix:
    fork + execl, execlp, execle, execv, execvp, execvp, execve

    win:
    CreateProcess

    手动狗头
    cjw1115
        30
    cjw1115  
       2019-03-25 11:55:28 +08:00
    @zycpp 这 API 有设计上的问题,但更多的问题在于你不了解 COM 吧
    tcjj3
        31
    tcjj3  
       2019-03-25 12:04:24 +08:00 via Android
    @whoami9894 抱歉失误了,刚开始是想到汇编,汇编其中的中断和 API 的用法相似,没去了解清楚 API 的概念扯到了二进制
    zhuangzhuang1988
        32
    zhuangzhuang1988  
       2019-03-25 12:12:36 +08:00
    @zycpp _In_ 这些是用来做提示和静态分析的,可以自动找 bug
    leonard916
        33
    leonard916  
       2019-03-25 12:26:54 +08:00
    tx 的 api 不是最醜的 api 嗎?
    macha
        34
    macha  
       2019-03-25 12:40:23 +08:00   ❤️ 1
    习惯就好,你要想到这个是 C 风格的,而且能做到向前兼容的那么好,已经很不容易了。
    nicevar
        35
    nicevar  
       2019-03-25 12:43:05 +08:00   ❤️ 1
    要是 windows api 算丑的话,那应该没有好看的,windows 表示不是针对谁,都是乐色
    mooncakejs
        36
    mooncakejs  
       2019-03-25 12:56:15 +08:00   ❤️ 1
    windows api  已经是非常好的 API 了。除了一些无法避免的历史包袱,但是横向对比,没有比它更好的。
    prolic
        37
    prolic  
       2019-03-25 13:28:45 +08:00
    毕竟是上古时期的产物,设计风格肯定和现在不一样
    bbxiong
        38
    bbxiong  
       2019-03-25 14:11:11 +08:00
    windows api 纯 C 的很清晰,一点也不丑
    AX5N
        39
    AX5N  
       2019-03-25 14:13:16 +08:00
    我觉得蛮好看的
    kristpan
        40
    kristpan  
       2019-03-25 14:18:45 +08:00   ❤️ 1
    @GeruzoniAnsasu Unix 本来就倾向于小巧的 api,如果你想把 fork 和 exce 合并在一起,可以用 system()嘛。CreateProcess 名称看起来确实爽,你看看它的参数列表吧:

    BOOL CreateProcessA(
    LPCSTR lpApplicationName,
    LPSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCSTR lpCurrentDirectory,
    LPSTARTUPINFOA lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
    );
    geelaw
        41
    geelaw  
       2019-03-25 14:42:30 +08:00
    @zycpp #24 我觉得惟一可以吐槽的是类型名是全大写,以及使用匈牙利命名法。然而实际上参数名并不是 signature 的一部分。

    @kristpan #40 system 和 CreateProcess 完全不同,更接近 ShellExecute 才对。而且“表达一个概念具有固有的复杂度”,因为 Win32/NT 上的一个进程需要这些信息,所以必须要提供。当然你可以 argue 应该提供一个简化版本的 CreateProcess 然后提供 CreateProcessEx。
    kristpan
        42
    kristpan  
       2019-03-25 15:01:28 +08:00
    @geelaw 当然,system 和 CreateProcess 不同。我摆出来主要是因为别人提到了 fork+execve,一般把 fork 和 execve 一起用和 system 的效果类似。
    wweir
        43
    wweir  
       2019-03-25 15:18:46 +08:00
    按照小伙伴的说法,阿里的 API 是最难用的,准确说是丁丁的 API
    ourleven
        44
    ourleven  
       2019-03-25 15:26:25 +08:00
    怎么说呢,代码质量还是可以的。(就是丑而已)

    工程师,不要那么在意 ^0^
    ysc3839
        45
    ysc3839  
       2019-03-25 15:50:03 +08:00
    @kristpan @geelaw 曾经有个更简单的 WinExec,不过被弃用了。
    IMCKH
        46
    IMCKH  
       2019-03-25 17:17:07 +08:00
    eclipse 的 swt
    dosmlp
        47
    dosmlp  
       2019-03-25 18:24:32 +08:00
    为了兼容性,毕竟祖传的接口不能随便改
    tomychen
        48
    tomychen  
       2019-03-25 18:42:01 +08:00
    @GeruzoniAnsasu
    win 的
    CreateProcess
    CreateProcessEx
    ShellExecute
    ShellExecuteEx
    WinExec

    也不少了吧
    nickr
        49
    nickr  
       2019-03-25 22:27:46 +08:00
    win32 时代的 -W, -A 太傻了. 比如 CreateWindowW(), CreateWindowA()
    xieyudi
        50
    xieyudi  
       2019-03-25 23:15:10 +08:00 via Android
    @tcjj3 不过汇编 /机器码也是种接口,和 win32api 类似。
    只不过这里所说的 win32api 是应用程序 /操作系统之间的接口,汇编 /机器码是软件程序 /RTL 的接口。
    ddup
        51
    ddup  
       2019-03-25 23:32:09 +08:00 via Android
    你写写 OBJC 就知道什么是饭猿类了
    geelaw
        52
    geelaw  
       2019-03-26 03:57:56 +08:00 via iPhone
    @tomychen #48 认为 ShellExecute 是启动进程是一个常见错误。ShellExecute = 在文件资源管理器里选择文件的上下文菜单操作,很多操作是没有“启动进程”这种说法的。
    ericgui
        53
    ericgui  
       2019-03-26 07:46:16 +08:00
    我同事写的
    weyou
        54
    weyou  
       2019-03-26 09:53:25 +08:00 via Android
    习惯问题,等你搞过 1 年 winapi 开发,你会发现其他的 api 都是渣渣。
    lizhuoli
        55
    lizhuoli  
       2019-03-26 10:27:04 +08:00 via iPhone
    匈牙利命名法真实奇葩……好好地 IDE 提示不用,给参数名加类型前缀……
    tomychen
        56
    tomychen  
       2019-03-26 13:36:01 +08:00
    @geelaw 哈,这就较真了...娱乐嘛,很多操作没有“启动进程”的行为,不代表这个功能不能用来启动进程嘛。就像 fork()除了能启动进程以外,还可以让进程变为守护进程一样。

    就事论事的态度而言,虽然很多猿都反感 MS,但可能更多人反感的是 MFC 吧,反感 winapi,楼上也有人提到了 API 里的
    CreateFileA(W)/CreateFileEx... 更多时候在我看来也是为了让开发者减少去适应一些新的 API,以及在各个大小版本上的兼容问题。

    反观某些平台,完全无视开发者,API 说弃用就弃用,是的,直接从底层摘掉,也就是上个版本还用得好好的程序,更新一下主系统,程序就启动不起来了。当然,这问题跟朋友讨论过,有说好,也有说不好。至于好还是不好呢,其实我也不知道。可能对系统厂商而言,减少了很多开销,但对开发者和用户而言其实是不太友好的。

    至于 win(32)API 再加上 MS 那套针对自己无比友好的 MSDN 而言,如果说它还不够好,我真不知道谁家的算好了.
    anyele
        57
    anyele  
       2019-03-27 10:32:25 +08:00
    @nickr #48 祖传的接口不能随便改
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3654 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:44 · PVG 12:44 · LAX 20:44 · JFK 23:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.