windows tool 64-बिट XE6 में विंडोज कॉलबैक से रिटर्निंग परिणाम



windows 8 operating system free download (1)

आपका कॉलबैक फ़ंक्शन सही रूप से घोषित नहीं है आप अंतिम पैरामीटर को var LPARAM रूप में घोषित कर रहे हैं, जो गलत है। lParam पैरामीटर मूल्य से पारित किया जाता है, संदर्भ द्वारा नहीं। जब EnumFontFamiliesEx() बुलाते हैं आप एक Boolean को lParam मान के रूप में एक सूचक दे ​​रहे हैं।

आपका कॉलबैक एक बाइट्स की sizeof(LPARAM) संख्या को लिखने की कोशिश कर रहा है जिसमें मेमोरी एड्रेस में केवल SizeOf(Boolean) बाइट्स उपलब्ध हैं (और आप एक Boolean को -1 लिखने का प्रयास क्यों कर रहे हैं?)। तो आप स्मृति को अधिलेखित कर रहे हैं एक स्थानीय चर में lParam रूप में एक सूचक का उपयोग करते समय, आप शायद कॉलिंग फंक्शन के कॉल स्टैक पर स्मृति को ओवरराइट कर रहे हैं जो वास्तव में कोई फर्क नहीं पड़ता है, इसलिए आप क्रैश नहीं देखते हैं।

आपको या तो करने की आवश्यकता है:

  1. var हटाने और lParam पैरामीटर को एक PBoolean :

    function FindFontFace(  lpelf: PLogFont;
                            lpntm: PTextMetric;
                            FontType: DWORD;
                            lParam: LPARAM): Integer ; stdcall;
    begin
      PBoolean(lParam)^ := True;
      Result := 0;       // 1 shot only please  - not interested in any variations in style etc
    end;

    या:

    function FindFontFace(  lpelf: PLogFont;
                            lpntm: PTextMetric;
                            FontType: DWORD;
                            lParam: PBoolean): Integer ; stdcall;
    begin
      lParam^ := True;
      Result := 0;       // 1 shot only please  - not interested in any variations in style etc
    end;
  2. var छोड़ें लेकिन पैरामीटर प्रकार को LPARAM बजाय Boolean बदल LPARAM :

    function FindFontFace(  var lpelf: TLogFont;
                            var lpntm: TTextMetric;
                            FontType: DWORD;
                            var lParam: Boolean): Integer ; stdcall;
    begin
      lParam := True;
      Result := 0;       // 1 shot only please  - not interested in any variations in style etc
    end;

या तो किसी दृष्टिकोण से आपको 32 EnumFontFamiliesEx() और 64 बिट दोनों में EnumFontFamiliesEx() को EnumFontFamiliesEx() में उत्तर देना होगा:

function FindFontbyFaceName(ACanvas: TCanvas; const AFacename: string): Boolean;
var
  lf: TLogFont;
begin
  Result := False;

  FillChar(lf, SizeOf(lf), 0);
  StrLCopy(lf.lfFaceName, PChar(AFacename), 32);
  lf.lfCharSet := DEFAULT_CHARSET;

  EnumFontFamiliesEX(ACanvas.Handle, lf, @FindFontFace, LPARAM(@Result), 0);
end;

एक तरफ ध्यान दें, एक कैनवास बनाने के लिए सिर्फ एक TImage बनाकर बेकार है। आपको इसे बिल्कुल भी ज़रूरत नहीं है:

function FindFontFace(  lpelf: PLogFont;
                        lpntm: PTextMetric;
                        FontType: DWORD;
                        lParam: LPARAM): integer ; stdcall;
begin
  PBoolean(lParam)^ := True;
  Result := 0;       // 1 shot only please  - not interested in any variations in style etc
end;

function FindFont(const AFacename: string): Boolean;
var
  lf: TLogFont;
  DC: HDC;
begin
  Result := False;

  FillChar(lf, SizeOf(lf), 0);
  StrLCopy(lf.lfFaceName, PChar(AFacename), 32);
  lf.lfCharSet := DEFAULT_CHARSET;

  DC := GetDC(0);
  EnumFontFamiliesEx(DC, lf, @FindFontFace, LPARAM(@Result), 0);
  ReleaseDC(0, DC);
end;

कहा जा रहा है कि, यदि आप TScreen.Fonts संपत्ति का उपयोग करते हैं तो EnumFontFamiliesEx() सीधे कॉल करने के बजाय आप कोड को आसान बना सकते हैं:

function FindFont(const AFacename: string): Boolean;
begin
  Result := (Screen.Fonts.IndexOf(AFacename) <> -1);
end;

मेरे पास कुछ कोड है जो यह निर्धारित करने के लिए EnumFontFamiliesEX का उपयोग करता है कि क्या कोई विशेष फ़ॉन्ट (इसका "फ़ैशन नाम" का उपयोग करके) स्थापित किया गया है या नहीं। कोड 32-बिट में ठीक काम कर रहा था जब मैं इसे संकलित करके 64-बिट के रूप में चलाता हूं, तो यह कॉलबैक रूटीन में एक अपवाद फेंक रहा था।

मैं अब इसे दोनों के तहत काम करने के लिए मिल गया है, लेकिन केवल अगर फ़ंक्शन FindFontbyFaceName के परिणाम को EnumFontFamiliesEX के 4 वां पैरामीटर के रूप में पारित करने के बजाय, मैं एक स्थानीय (या वैश्विक) चर - इस मामले में 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;




delphi-xe6