में नामित प्रक्रिया या फ़ंक्शन को गतिशील रूप से कैसे कार्यान्वित करें मैं फ़ंक्शन तालिका में रहने वाली प्रक्रियाओं या कार्यों को गतिशील रूप से लागू करने की क्षमता के साथ प्रयोग कर रहा हूं। विशिष्ट अनुप्रयोग एक डीएलएल है जो तर्क और प्रकारों की संख्या के साथ एक फ़ंक्शन तालिका में एक सूचक को निर्यात करता है। मेजबान एप्लिकेशन में डीएलएल से पूछताछ करने और कार्यों को कॉल करने की क्षमता होती है। यदि वे ऑब्जेक्ट विधियां थे तो मैं उन्हें आमंत्रित करने के लिए आरटीआई का उपयोग कर सकता था लेकिन वे सामान्य प्रक्रियाएं और कार्य हैं। DLL सामान्य कार्य संकेत दिए गए निर्यात करने के लिए है नहीं वस्तुओं क्योंकि DLL सी, डेल्फी आदि सहित किसी भी भाषा में लिखा जा सकता हैडेल्फी
उदाहरण के लिए, मैं एक रिकॉर्ड की घोषणा की और एक DLL में भरा है:
TAPI = record
add : function (var a, b : double) : double;
mult : function (var a, b : double) : double;
end;
PAPI = ^TAPI;
मैं पुनः प्राप्त इस रिकॉर्ड के लिए सूचक, घोषित:
apiPtr : PAPI;
मान लें मैं भी प्रक्रियाओं के नाम की पहुंच है, तर्क और रिकॉर्ड में प्रत्येक प्रविष्टि के लिए तर्क प्रकारों की संख्या।
मान लें कि मैं ऐड फ़ंक्शन को कॉल करना चाहता हूं। जोड़ने के लिए समारोह सूचक होगा:
@apiPtr^.add // I assume this will give me a pointer to the add function
मुझे लगता है कोई दूसरा रास्ता नहीं है अन्य की तुलना में कुछ एएसएम उपयोग करने के लिए ढेर पर आवश्यक तर्क धक्का और परिणाम पुनः प्राप्त करने के?
पहला सवाल, प्रक्रिया को घोषित करने के लिए सबसे अच्छा कॉलिंग सम्मेलन क्या है, सीडीसीएल? कॉल से पहले ढेर को इकट्ठा करने के लिए सबसे आसान लगता है।
दूसरा प्रश्न, क्या कोई उदाहरण ऑनलाइन है जो वास्तव में ऐसा करता है? मैं http://www.swissdelphicenter.ch/torry/showcode.php?id=1745 (DynamicDllCall) जो मैं चाहता के करीब है भर में आया था, लेकिन मैं सरलीकृत नीचे के रूप में, यह अब परिणाम के लिए सूचक (EAX) देता है:
function DynamicDllCall(proc : pointer; const Parameters: array of Pointer): pointer;
var x, n: Integer;
p: Pointer;
begin
n := High(Parameters);
if n > -1 then begin
x := n;
repeat
p := Parameters[x];
asm
PUSH p
end;
Dec(x);
until x = -1;
end;
asm
CALL proc
MOV p, EAX <- must be changed to "FST result" if return value is double
end;
result := p;
अंत;
लेकिन मैं इसे काम नहीं कर सकता, यह परिणाम के बजाय पहले पैरामीटर के लिए एक मूल्य देता है। हो सकता है कि मेरे पास कॉलिंग सम्मेलन गलत हो या शायद मैं गलत समझूं कि ईएक्स में परिणाम कैसे प्राप्त किया जाए।
var proc : pointer;
parameters: array of Pointer;
x, y, z : double;
p : pointer;
begin
x:= 2.3; y := 6.7;
SetLength(parameters, 2);
parameters[0] := @x; parameters[1] := @y;
proc := @apiPtr^.add;
p := DynamicDllCall(proc, Parameters);
z := double (p^);
किसी भी सलाह कृतज्ञता प्राप्त किया: इस प्रकार
मैं DynamicDllCall कहते हैं। मैं सराहना करता हूं कि कुछ लोगों को यह महसूस हो सकता है कि ऐसा करने के बारे में कोई नहीं होना चाहिए, लेकिन यदि यह कम से कम संभव है तो भी मैं उत्सुक हूं।
अद्यतन 1 मैं पुष्टि कर सकता हूं कि ऐड फ़ंक्शन को अतिरिक्त करने के लिए सही मान मिल रहे हैं।
अद्यतन 2 अगर मैं करने के लिए जोड़ के हस्ताक्षर बदलने के लिए:
add : function (var a, b, c : double) : double;
और मैं करने के लिए ग के अंदर जोड़ने के परिणाम दें और इसके बाद मैं पैरामीटर सरणी में सही उत्तर प्राप्त कर सकते हैं (यह मानते हुए मैं एक जोड़ने इसके लिए अधिक तत्व, 2 के बजाय 3)। इसलिए समस्या यह है कि मैं गलत समझता हूं कि कार्यों से मूल्य कैसे लौटाए जाते हैं। क्या कोई समझा सकता है कि फ़ंक्शन मूल्य कैसे लौटते हैं और उन्हें कैसे पुनर्प्राप्त किया जा सकता है?
अद्यतन 3 मेरे पास मेरा जवाब है। मुझे अनुमान लगाया जाना चाहिए था। डेल्फी विभिन्न रजिस्टरों के माध्यम से विभिन्न प्रकार लौटाता है। उदाहरण के लिए ईएक्स के माध्यम से पूर्णांक वापसी, दूसरे हाथ पर डबल एसटी (0) के माध्यम से देता है। परिणाम चर में एसटी (0) की प्रतिलिपि बनाने के लिए मुझे "एमओवी पी, ईएक्स" के बजाय "एफएसटी परिणाम" का उपयोग करना होगा। कम से कम अब मुझे पता है कि ऐसा करने के लिए सिद्धांत में यह संभव है। चाहे यह करने के लिए एक समझदार बात है, अब एक और बात है जिसके बारे में मुझे अब सोचना चाहिए। जो भी कारण के लिए, आप तय कर लिया है वाई समाधान है, लेकिन आप वाई काम करने में परेशानी हो रही आप एक्स करना चाहते हैं, और,:
www.delphi3000.com (लेख/article_3766.asp) पर डेल्फी एएसएम के लिए एक अच्छा परिचय किया गया था, लेकिन यह पूरी साइट अब चली गई है ... –
शायद [विधानसभा प्रक्रियाओं और कार्यों] पर दस्तावेज़ीकरण (http : //docwiki.embarcadero.com/RADStudio/XE4/en/Assembly_Procedures_and_Functions) मदद करेगा। 'फंक्शन परिणाम' विषय देखें। –
वहां बहुत कुछ नहीं है और आधिकारिक दस्तावेज़ भयानक उपयोगी नहीं हैं।हालांकि मैंने पर्याप्त जानकारी प्राप्त की: http://stackoverflow.com/questions/15786404/fld-instruction-x64-bit और http://www.guidogybels.eu/docs/Using%20Assembler%20in% 20Delphi.pdf – rhody