輸入法開發(fā)——實(shí)戰(zhàn)<一>注冊(cè)輸入法與注意事項(xiàng)
用戶可以手動(dòng)修改注冊(cè)表以注冊(cè)輸入法,但是這個(gè)方法過于低效
regsvr32 可以調(diào)用程序的 DllRegisterServer() 和?DllUnegisterServer
這兩個(gè)方法只負(fù)責(zé)?Dll 的 注冊(cè) 和 清除注冊(cè),不同 Dll 之間只有標(biāo)識(shí)不同,因此可以直接使用示例中的代碼來注冊(cè)服務(wù)??稍谝韵挛募胁榭?/p>
每一個(gè) Dll 封裝的服務(wù)都有多個(gè) UUID (只是名稱不大同,其本質(zhì)就是 UUID,在此亦稱作 GUID,可以使用 UUID 生成器生成)
DLL 外露的 四個(gè)接口,需要在 def 文件中定義,這個(gè)第一章就已經(jīng)提過了。
需要注意的是 __stdcall,
我們知道,C?標(biāo)準(zhǔn)中,對(duì)常見的幾種架構(gòu)有調(diào)用規(guī)范,x86_64 64位應(yīng)用是先使用寄存器,后使用棧。
C++ 標(biāo)準(zhǔn)沒有這些規(guī)定,C++ 相較?C 缺少過多的具體化規(guī)范,這也是我個(gè)人看來 C++ 的一大不足。傳值沒有固定順序,會(huì)生產(chǎn)混亂,G++ 生產(chǎn)的 OBJ 無法和 CLANG 的直接通用。因此許多代碼中大量使用 extern "C" 。
__stdcall 是類extern "C" 但不完全是,不然就是?#define __stdcall extern "C" 了
在舊時(shí)代,Windows 應(yīng)用和 API 都使用棧傳參。為了保證兼容性,WindowsAPI 一直使用棧傳(t**d, 不愧是屎山,x86?改?x64?都沒治好你的壞習(xí)慣)
__stdcall 就是表示 extern "C" + use stack only (前者不太確定,后者是肯定的)
在之后的代碼中,一切接口都要使用 __stdcall 去修飾。
(class) (*func)(void) 的傳值不使用 __stdcall 短時(shí)間內(nèi)是不會(huì)誘發(fā) 內(nèi)存問題的,但是這個(gè)行為是非常危險(xiǎn)的。
水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水