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

还有比 winapi 更丑的 api 吗?

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

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

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

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

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

    win:
    CreateProcess

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

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

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

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

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

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

    至于 win(32)API 再加上 MS 那套针对自己无比友好的 MSDN 而言,如果说它还不够好,我真不知道谁家的算好了.
        57
    anyele   28 天前
    @nickr #48 祖传的接口不能随便改
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2054 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 16:10 · PVG 00:10 · LAX 09:10 · JFK 12:10
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1