还有比 winapi 更丑的 api 吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
zycpp
V2EX    程序员

还有比 winapi 更丑的 api 吗?

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

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

    @Nasei #8 实际上 HWND、LPARAM 都是图形界面编程才用得到的 API,Unix 系根本没有等价的。
    zycpp
        12
    zycpp  
    OP
       2019 年 3 月 25 日 via iPhone
    @geelaw 主要用 win32 和 com,丑是关键,看着难受…
    msg7086
        13
    msg7086  
       2019 年 3 月 25 日 via Android
    年代有点久远了吧,放在 20 年前我觉得还行?
    46fo
        14
    46fo  
       2019 年 3 月 25 日
    这是引战?
    Nasei
        15
    Nasei  
       2019 年 3 月 25 日 via Android
    @geelaw 仅是指的命名…因为我是从 posix api 那边开始接触的,所以后来接触 win32 api 的时候就先入为主了
    murmur
        16
    murmur  
       2019 年 3 月 25 日   1
    api 丑架不住 ide 牛批
    anyele
        17
    anyele  
       2019 年 3 月 25 日
    在学校的时候, 一开始学 MFC 感觉 API 写的很好啊
    abelmakihara
        18
    abelmakihara  
       2019 年 3 月 25 日
    @anyele #17 当年在学校就被 MFC 还有 ssh 当年的一堆 xml 劝退了 害怕
    Removable
        19
    Removable  
       2019 年 3 月 25 日
    @Ediacaran @xiusedelang 哇,感觉给塞班写过 app 的都是大佬啊
    tomychen
        20
    tomychen  
       2019 年 3 月 25 日
    你到底是为了喷 WINAPI 还是为了喷 windows
    能不能举个栗子?来证明又烂又丑?
    Alexinder
        21
    Alexinder  
       2019 年 3 月 25 日
    arcgis 不过好像不丑
    anyele
        22
    anyele  
       2019 年 3 月 25 日   3
    @abelmakihara #17 在学校学 Java 我是被 Eclipse 和 XML 劝退的, 因为有 VS 先入为主, 觉得 Eclipse 是什么辣鸡玩意,直到后面接触了 IDEA 才算是入了 Java 的坑。 当时还背过从 WinMain 函数,注册窗口,创建窗口,消息循环函数这一堆流程和代码
    tabris17
        23
    tabris17  
       2019 年 3 月 25 日   1
    windows API 是有历史包袱的,毕竟是从 win1.0 时代继承的祖传接口。能维护成这样已经非常不容易了
    zycpp
        24
    zycpp  
    OP
       2019 年 3 月 25 日 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 年 3 月 25 日 via Android
    @zycpp 这不写的挺好的吗?你是想说那些宏吗?
    ArchVile
        26
    ArchVile  
       2019 年 3 月 25 日   1
    Windows Api 的文档微软算是做的很不错的了。
    tomychen
        27
    tomychen  
       2019 年 3 月 25 日   1
    @zycpp
    你这是要对比 stl 还是要对比 objc?
    老实说 WINAPI 相比众多 API 而言,已经算是很友好了,至少从命名上已经能估到作用,再加上 MSDN,也算是对 dever 相对友好了吧

    君不如埋头看看 Obj-c 的 API 和文档,知足吧。
    kristpan
        28
    kristpan  
       2019 年 3 月 25 日 via Android
    @ZavierXu 我觉得 Unix 的 API 相当优雅呀
    GeruzoniAnsasu
        29
    GeruzoniAnsasu  
       2019 年 3 月 25 日   7
    @kristpan
    unix:
    fork + execl, execlp, execle, execv, execvp, execvp, execve

    win:
    CreateProcess

    手动狗头
    cjw1115
        30
    cjw1115  
       2019 年 3 月 25 日
    @zycpp 这 API 有设计上的问题,但更多的问题在于你不了解 COM 吧
    tcjj3
        31
    tcjj3  
       2019 年 3 月 25 日 via Android
    @whoami9894 抱歉失误了,刚开始是想到汇编,汇编其中的中断和 API 的用法相似,没去了解清楚 API 的概念扯到了二进制
    zhuangzhuang1988
        32
    zhuangzhuang1988  
       2019 年 3 月 25 日
    @zycpp _In_ 这些是用来做提示和静态分析的,可以自动找 bug
    leonard916
        33
    leonard916  
       2019 年 3 月 25 日
    tx 的 api 不是最的 api ?
    macha
        34
    macha  
       2019 年 3 月 25 日   1
    习惯就好,你要想到这个是 C 风格的,而且能做到向前兼容的那么好,已经很不容易了。
    nicevar
        35
    nicevar  
       2019 年 3 月 25 日   1
    要是 windows api 算丑的话,那应该没有好看的,windows 表示不是针对谁,都是乐色
        36
    mooncakejs  
       2019 年 3 月 25 日   1
    windows api已经是非常好的 API 了。除了一些无法避免的历史包袱,但是横向对比,没有比它更好的。
    prolic
        37
    prolic  
       2019 年 3 月 25 日
    毕竟是上古时期的产物,设计风格肯定和现在不一样
    bbxiong
        38
    bbxiong  
       2019 年 3 月 25 日
    windows api 纯 C 的很清晰,一点也不丑
    AX5N
        39
    AX5N  
       2019 年 3 月 25 日
    我觉得蛮好看的
    kristpan
        40
    kristpan  
       2019 年 3 月 25 日   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 年 3 月 25 日
    @zycpp #24 我觉得惟一可以吐槽的是类型名是全大写,以及使用匈牙利命名法。然而实际上参数名并不是 signature 的一部分。

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

    工程师,不要那么在意 ^0^
    ysc3839
        45
    ysc3839  
       2019 年 3 月 25 日
    @kristpan @geelaw 曾经有个更简单的 WinExec,不过被弃用了。
    IMCKH
        46
    IMCKH  
       2019 年 3 月 25 日
    eclipse 的 swt
    dosmlp
        47
    dosmlp  
       2019 年 3 月 25 日
    为了兼容性,毕竟祖传的接口不能随便改
    tomychen
        48
    tomychen  
       2019 年 3 月 25 日
    @GeruzoniAnsasu
    win 的
    CreateProcess
    CreateProcessEx
    ShellExecute
    ShellExecuteEx
    WinExec

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

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

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

    至于 win(32)API 再加上 MS 那套针对自己无比友好的 MSDN 而言,如果说它还不够好,我真不知道谁家的算好了.
    anyele
        57
    anyele  
       2019 年 3 月 27 日
    @nickr #48 祖传的接口不能随便改
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2850 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 14:46 PVG 22:46 LAX 07:46 JFK 10:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86