के बीच इस प्रकार मैं एक DLL जो एक डिकोडिंग समारोह प्रदान की है:पूर्व आवंटित स्मृति HostApp और DLL
function MyDecode (Source: PChar; SourceLen: Integer; var Dest: PChar; DestLen: Integer): Boolean; stdcall;
HostApp कॉल "MyDecode", और स्रोत, SourceLen और डेस्ट मापदंडों में स्थानांतरित, डीएलएल ने डेस्ट और डेस्टलेन को डीकोड किया। समस्या यह है: होस्ट ऐप को डीकोडेड डेस्ट लम्बाई को जानना असंभव है, और इसलिए यह नहीं पता होगा कि डेस्ट की स्मृति को पूर्व-आवंटित कैसे किया जाए।
मुझे पता है कि दो कार्यों में "MyDecode" विभाजित कर सकते हैं:
function GetDecodeLen (Source: PChar; SourceLen: Integer): Integer; stdcall; // Return the Dest's length
function MyDecodeLen (Source: PChar; SourceLen: Integer; var Dest: PChar): Boolean; stdcall;
लेकिन, मेरे डिकोडिंग प्रक्रिया बहुत जटिल है, इसलिए यदि दो कार्यों में विभाजित दक्षता को प्रभावित करेगा।
क्या कोई बेहतर समाधान है?
हाँ अलेक्जेंडर, यह एक अच्छा समाधान हो सकता है। HostApp कोड:
//...
MyDecode(....)
try
// Use or copy Dest data
finally
FreeDecodeResult(...)
end;
DLL कोड:
function MyDecode(...): Boolean;
begin
// time-consuming calculate
// Allocate memory
GetMem(Dest, Size);
// or New()?
// or HeapAlloc()?
end;
procedure FreeDecodeResult(Dest: PChar);
begin
FreeMem(Dest);
// or Dispose(Dest); ?
// or HeapFree(Dest); ?
end;
शायद मैं सूचक को उसके गंतव्य के प्रकार बदलना चाहिए।
मेमोरी विधि बेहतर आवंटित कौन सा है? GetMem/New, या HeapAlloc?
आप किस समस्या को हल करने की कोशिश कर रहे हैं: 1) अग्रिम आवंटित राशि का आकलन कैसे करें; 2) कॉलर और कैली के बीच गतिशील स्मृति प्रबंधन का समन्वय कैसे करें? –
मार्सेलो के लिए: 1) कॉलर अग्रिम आवंटित राशि को नहीं समझ सकता है। 2) हां। – Leo
> मेमोरी विधि को बेहतर आवंटित कौन सा है? आपके मामले में इससे कोई फर्क नहीं पड़ता। विधि का प्रयोग करें, जिसे आप परिचित हैं (मैं GetMem/FreeMem पसंद करता हूं)। – Alex