2010-04-20 31 views
1

這應該是非常簡單的問題。這裏有很多編程語言,編譯成機器代碼或託管代碼。我剛從高中開始學習ASM。彙編器非常好,因爲你知道CPU究竟做了什麼。接下來,(正如你可以在這裏看到我的其他問題),我決定學習C和C++。我從我讀的語言中選擇了C becouse,它是輸出與彙編程序最接近的語言。不同的編程語言的可能性

但是,我想知道的是,任何其他Windows編程語言都可以調用win32 API嗎?確切地說,像C有其特殊的標題和功能的win32 API互動,這是否被認爲是編程語言的一些重要組成部分?或者是否有任何語言不支持調用win32 API,或者只是將控制檯用於IO以及基本文件IO的某些功能? Becouse,對於使用圖形輸出的Windows編程,必須獲取win32 API。我知道這個問題可能看起來很愚蠢,但仍然請,幫助我,我請求學習poposes。謝謝。

回答

2

許多不同的語言都有打開和使用windows DLL文件的方法,所以你可以打開包含API函數並使用它們的系統DLL。

一些語言例如C通過提供一個很好的頭文件來幫助你解決問題。

我以前見過的唯一一種可以直接訪問WinAPI而無需事先打開任何庫的其他語言就是一種稱爲Purebasic的BASIC語言。

+1

windows.h只是讓你的程序知道'C:\ Windows'中的DLL裏面有什麼。當你導入windows.h時,你可以直接使用API​​函數,而不會有任何關於它的問題。當使用其他語言時,您可能必須手動打開DLL文件才能調用其中包含的函數。 printf()是所有C編譯器附帶的標準庫的一部分。標準庫是一個較小的庫,其中包含所有需要跨平臺的基本內容。 WinAPI的東西不是跨平臺的。 – 2010-04-20 18:05:36

+0

好的,謝謝。我能再多提一個小問題嗎?如果標準庫是跨平臺的,那麼在Windows或Linux編譯器中,像printf()這樣的函數必須是相同的。所以,Windows和Linux都必須支持它。我的意思是支持控制檯進行處理並與其進行相同的通信。但我認爲Console應用程序和GUI win32項目的唯一區別在於,控制檯應用程序在啓動時自動分配控制檯。所以我認爲即使像printf()這樣的函數也是特定於平臺的。 Becouse,例如Dos使用int 21h輸出,我認爲Linux使用int 80h。 – 2010-04-20 19:34:06

+1

是的,Windows控制檯應用程序確實使用WinAPI分配啓動時立即打開的控制檯(如果未從其他控制檯調用)。但是,在Linux上,你不得不從終端窗口調用該程序(一旦爲該平臺編譯過)。對於輸入/輸出的東西也不用擔心硬件問題,可以考慮使用stdin/stdout/stderr等流進行通信。這從硬件細節中抽象出來,並允許跨平臺編程。 – 2010-04-20 20:49:07

0

我用來獲取Windows API的第一種語言是VB4。是的,大多數語言都可以通過某種方式訪問​​API。

1

你問的是如何從程序集中調用Win32?

只需使用MASM(或TASM,或......)

實例的Hello World調用Win32的:

==== HelloWin.asm ============================== 
.586 
.model flat, stdcall 

EXTERN [email protected]:NEAR 

.data 
szCaption db 'Hello World',0 
szAppName db 'HelloWorld',0 

.code 
start: 
push 0 
push offset szCaption 
push offset szAppName 
push 0 
call [email protected] 
ret 

end start 
=================================================== 

要裝配:

ML.EXE/COFF/C HelloWin.asm

鏈接:

鏈路/子系統:視窗HelloWin.obj/defaultlib:C:\ MAS m32 \ lib \ user32.lib

0

可以從C,C++,VB,VB .net和C#獲得Win32功能。在後兩種情況下,您通常會使用漂亮的CLR庫,但如果您知道正確的語法糖灑落,則可以直接調用本機(非託管)API。

Win32的用法不限於上面的列表。這是一個C API的原因:所以任何語言本質上知道如何做出正確的函數調用可以調用它們。在這種情況下,「正確的」是stdcall。所有語言的編譯器(或其他)所要做的就是加載正確的DLL,並按照正確的順序將參數(和其他信息)推入堆棧,這樣你就可以繼續使用。