还有比 winapi 更丑的 api 吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
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 div class="fr">     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
@ZavierX 我觉得 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     Solana     3082 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 27ms UTC 12:22 PVG 20:22 LAX 05:22 JFK 08:22
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