2008-11-07 15 views
10

में विदेशी के साथ स्ट्रिंग लौटने वाले Win32 फ़ंक्शन को कॉल करना मैं Win32 फ़ंक्शंस को कॉल करने के लिए alien का उपयोग करने का प्रयास कर रहा हूं। मैंने इस कोड की कोशिश की, लेकिन यह दुर्घटनाग्रस्त हो गया और मुझे समझ में नहीं आता क्यों।लूआ

require("alien") 

local f = alien.Kernel32.ExpandEnvironmentStringsA 
f:types("int", "string", "pointer", "int") 
local buffer = alien.buffer(512) 
f("%USERPROFILE%", 0, 512) 

उत्तर

11

यह एक अच्छा सवाल के रूप में यह है, मेरे लिए, बाहर विदेशी परीक्षण करने के लिए एक अवसर ...

आप कोई आपत्ति नहीं है, मैं कैसे विदेशी उपयोग करने के लिए समझाने के लिए अवसर ले, तो मेरे जैसे लोग (require पर बहुत उपयोग नहीं किया जाता है) इस धागे पर ठोकरें शुरू हो जाएंगी ...

आप लुआफोर्ज पेज से लिंक देते हैं, मैं वहां गया, और देखा कि मुझे इसे पाने के लिए लुआरॉक की आवश्यकता है। :-( मुझे बाद में किसी दिन इंस्टॉल करना चाहिए, लेकिन मैंने अभी इसे छोड़ना चुना है। इसलिए मैं रिपोजिटरी में गया और alien-0.4.1-1.win32-x86.rock डाउनलोड किया। मुझे पता चला कि यह एक सादा ज़िप फ़ाइल थी, जिसे मैं सामान्य रूप से अनजिप कर सकता था।

require साथ एक सा fumbling के बाद, मैं एक त्वरित परीक्षण के लिए लुआ स्क्रिप्ट में रास्तों हैकिंग समाप्त हो गया। मैं बजाय LUA_PATH और मेरे वातावरण में LUA_CPATH बनाना चाहिए, मुझे लगता है कि बाद में करेंगे।

तो मैं विदेशी ले लिया। lua, core.dll और struct.dll unzipped फ़ोल्डरों से और उन्हें एक सामान्य लाइब्रेरी भंडार में एलियन नाम की निर्देशिका के तहत डाल दिया।
और मैंने एफ जोड़ा मेरी स्क्रिप्ट के शुरू करने के लाइनों ollowing (बुरा हैक चेतावनी!): MessageBox:

package.path = 'C:/PrgCmdLine/Tecgraf/lib/?.lua;' .. package.path 
package.cpath = 'C:/PrgCmdLine/Tecgraf/lib/?.dll;' .. package.path 
require[[Alien/alien]] 

तो मैं एक साधारण फ़्रिल रहित तत्काल दृश्य परिणाम के साथ समारोह के साथ यह कोशिश की।

local mb = alien.User32.MessageBoxA 
mb:types{ 'long', 'long', 'string', 'string', 'long' } 
print(mb(0, "Hello World!", "Cliché", 64)) 

हाँ, मुझे संदेश बॉक्स मिला है! लेकिन ठीक क्लिक करने पर, मुझे शायद आपके जैसे लुआ का दुर्घटना हो गया। विदेशी डॉक्स के एक त्वरित स्कैन करने के बाद, मुझे पता चला (बेनाम) अपराधी:

mb:types{ ret = 'long', abi = 'stdcall', 'long', 'string', 'string', 'long' } 

तो यह काम करने के लिए अपने कॉल करने के लिए तुच्छ था: हम Windows API के लिए stdcall बुला सम्मेलन उपयोग करने की आवश्यकता:

local eev = alien.Kernel32.ExpandEnvironmentStringsA 
eev:types{ ret = "long", abi = 'stdcall', "string", "pointer", "long" } 
local buffer = alien.buffer(512) 
eev("%USERPROFILE%", buffer, 512) 
print(tostring(buffer)) 

नोट मैं EEV कॉल में बफर पैरामीटर डाल ...

+0

वाह! आप विंडोज के लिए लुआ का भी उपयोग कर सकते हैं (http://luaforwindows.luaforge.net/)। यह बॉक्स के बाहर काम कर रहे विदेशी के साथ आता है। – Jazz

+0

हां, लेकिन हालांकि यह एक अच्छा पैकेज है, मुझे इसकी "सभी बैटरी शामिल" दर्शन पसंद नहीं है, जिसके परिणामस्वरूप पायथन की तुलना में एक बड़ा डाउनलोड होता है ... – PhiLho

संबंधित मुद्दे