में विंडोज कॉलबैक से रिटर्निंग परिणाम मेरे पास कुछ कोड है जो यह निर्धारित करने के लिए EnumFontFamiliesEX का उपयोग करता है कि कोई विशेष फ़ॉन्ट (इसके "facename" का उपयोग कर) स्थापित है या नहीं। कोड 32-बिट में ठीक काम कर रहा था। जब मैं इसे 64-बिट के रूप में संकलित और चलाता हूं, तो उसने कॉलबैक रूटीन में अपवाद फेंक दिया।64-बिट XE6
मैं अब दोनों के तहत काम करने के लिए यह मिल गया है, लेकिन केवल EnumFontFamiliesEX को 4 पैरामीटर के रूप में समारोह FindFontbyFaceName के परिणाम में उत्तीर्ण होने की बजाय अगर, मैं एक स्थानीय (या वैश्विक) चर पारित - इस मामले में MYresult। (और उसके बाद परिणाम सेट करें)। मुझे समझ में नहीं आता कि क्या हो रहा है? क्या कोई मुझे बेहतर तरीके से समझा सकता है या इंगित कर सकता है। (मैं मूल कॉलबैक यांत्रिकी के रूप में फोंट के यांत्रिकी में इतनी दिलचस्पी नहीं रखता हूं)।
// single font find callback
function FindFontFace( {$IFDEF CPUX86} lpelf: PLogFont; {$ENDIF}
{$IFDEF CPUX64} lpelf: PEnumLogFontEx; {$ENDIF}
lpntm: PNewTextMetricEx;
AFontType: DWORD; var Aresult: lparam): integer ; stdcall;
begin
result := 0; // 1 shot only please - not interested in any variations in style etc
if (lpelf <> nil) then
Aresult := -1 // TRUE
else
Aresult := 0;
end;
function FindFontbyFaceName(ACanvas: TCanvas; const AFacename: string): boolean;
var
lf: TLogFont;
Myresult: boolean;
begin
MYresult := false;
FillChar(lf, SizeOf(lf), 0);
StrLCopy(lf.lfFaceName, PChar(AFacename), 32);
lf.lfCharSet := DEFAULT_CHARSET;
// this works in both 32 and 64 bit
EnumFontFamiliesEX(ACanvas.Handle, lf, @FindFontFace, lparam(@MYresult), 0);
result := MYresult;
// this works in 32 bit but throws exception in callback in 64 bit
// EnumFontFamiliesEX(ACanvas.Handle, lf, @FindFontFace, lparam(@result), 0);
end;
function FindFont(const AFacename: string): boolean;
var
AImage: TImage;
begin
AImage := Timage.Create(nil);
try
result := FindFontbyFaceName(AImage.Canvas, Afacename);
finally
Aimage.Free;
end;
end;
LPARAMs विभिन्न आकारों Win32 में हैं और Win64। MyResult बनाने के लिए सबसे आसान होगा: LPARAM और फिर परिणाम दें: = (MyResult = -1)। – FredS
@FredS धन्यवाद। मुख्य सवाल यह है कि मुझे उस स्थानीय/वैश्विक चर की आवश्यकता क्यों है? मैं सीधे परिणाम का उपयोग क्यों नहीं कर सकता? – TomB
@TomB: आपका कॉलबैक स्मृति को मिटा रहा है। मेरा जवाब देखें –