Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [DELPHI] - Problemi shareMem

    Ciao, devo scrivere una DLL in delphi da richiamare sempre in delphi attraverso un form .NET
    Il problema è questo: metto nelle clausole USES della DLL e del FORM stesso la Sharemem, come indicato nell'avviso della DLL, ma nel form non gli piace, nel senso che mi da un mucchio di errori di compilazione.

    es di codice :
    codice:
    uses
      ShareMem in 'c:\Programmi\Borland\BDS\3.0\source\Win32\rtl\sys\ShareMem.pas',
      System.Reflection,
      System.Runtime.CompilerServices,
      System.Windows.Forms,
      WinForm in 'WinForm.pas' {WinForm.TWinForm: System.Windows.Forms.Form},
      masterlib in 'masterlib.pas';
    ...NO ONE IS INNOCENT ANYMORE...

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    La unit ShareMem è strettamente legata alla piattaforma
    Win32: non è utilizzabile in ambiente .NET poichè il framework fornisce il proprio gestore di memoria implementato dal CLR assieme al Garbage Collector.

    Sviluppare su Win32 non è uguale a sviluppare su .NET.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Ciao, allora ho provato a fare una .NET DLL, e l'ho richiamata dal form .NET, scrivendo questo codice :

    in my dll :
    codice:
    library dllMASTERLIB;
    
    {$UNSAFECODE ON}
    
    {%DelphiDotNetAssemblyCompiler 'c:\programmi\file comuni\borland 
    shared\bds\shared assemblies\3.0\Borland.Delphi.dll'}
    
    uses
      SysUtils,
      Classes,
      Variants,
      System.Reflection,
      System.Runtime.InteropServices;
    
    [assembly: AssemblyTitle('')]
    [assembly: AssemblyDescription('')]
    [assembly: AssemblyConfiguration('')]
    [assembly: AssemblyCompany('')]
    [assembly: AssemblyProduct('')]
    [assembly: AssemblyCopyright('')]
    [assembly: AssemblyTrademark('')]
    [assembly: AssemblyCulture('')]
    
    //
    // Version information for an assembly consists of the following four 
    values:
    //
    //      Major Version
    //      Minor Version
    //      Build Number
    //      Revision
    //
    // You can specify all the values or you can default the Revision and Build 
    Numbers
    // by using the '*' as shown below:
    
    [assembly: AssemblyVersion('1.0.*')]
    
    //
    // In order to sign your assembly you must specify a key to use. Refer to 
    the
    // Microsoft .NET Framework documentation for more information on assembly 
    signing.
    //
    // Use the attributes below to control which key is used for signing.
    //
    // Notes:
    //   (*) If no key is specified, the assembly is not signed.
    //   (*) KeyName refers to a key that has been installed in the Crypto 
    Service
    //       Provider (CSP) on your machine. KeyFile refers to a file which 
    contains
    //       a key.
    //   (*) If the KeyFile and the KeyName values are both specified, the
    //       following processing occurs:
    //       (1) If the KeyName can be found in the CSP, that key is used.
    //       (2) If the KeyName does not exist and the KeyFile does exist, the 
    key
    //           in the KeyFile is installed into the CSP and used.
    //   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) 
    utility.
    //       When specifying the KeyFile, the location of the KeyFile should be
    //       relative to the project output directory. For example, if your 
    KeyFile is
    //       located in the project directory, you would specify the 
    AssemblyKeyFile
    //       attribute as [assembly: AssemblyKeyFile('mykey.snk')], provided 
    your output
    //       directory is the project directory (the default).
    //   (*) Delay Signing is an advanced option - see the Microsoft .NET 
    Framework
    //       documentation for more information on this.
    //
    [assembly: AssemblyDelaySign(false)]
    [assembly: AssemblyKeyFile('')]
    [assembly: AssemblyKeyName('')]
    
    //
    // Use the attributes below to control the COM visibility of your assembly. 
    By
    // default the entire assembly is visible to COM. Setting ComVisible to 
    false
    // is the recommended default for your assembly. To then expose a class and 
    interface
    // to COM set ComVisible to true on each one. It is also recommended to add 
    a
    // Guid attribute.
    //
    
    [assembly: ComVisible(False)]
    //[assembly: Guid('')]
    //[assembly: TypeLibVersion(1, 0)]
    
    procedure CARD_TO_S(var input:cardinal; var output:string);  ilcode; // 
    export;
    begin
        output:=IntToStr(input);
          //output:=String(input);
          //output:='Ciao';
      end;
    exports
        CARD_TO_S;
    begin
    end.

    Nel mio FORM :

    codice:
    implementation
          procedure CARD_TO_S(var input:cardinal; var output:String); ilcode; 
    external 'D:\DAISIT\ATE A 129\delphi\NUOVA DLL MASTERLIB 
    .NET\dllMASTERLIB.dll';
    
    
    //Description
    {$AUTOBOX ON}
    
    {$REGION 'Windows Form Designer generated code'}
    /// <summary>
    /// Required method for Designer support -- do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    procedure TWinForm.InitializeComponent;
    var
      resources: System.Resources.ResourceManager;
    begin
      resources := System.Resources.ResourceManager.Create(TypeOf(TWinForm));
      Self.Terminale := AxDartVt.AxVt.Create;
      (System.ComponentModel.ISupportInitialize(Self.Terminale)).BeginInit;
      Self.SuspendLayout;
      //
      // Terminale
      //
      Self.Terminale.Location := System.Drawing.Point.Create(8, 8);
      Self.Terminale.Name := 'Terminale';
      Self.Terminale.OcxState := 
    (System.Windows.Forms.AxHost.State(resources.GetObject('T' +
        'erminale.OcxState')));
      Self.Terminale.Size := System.Drawing.Size.Create(1000, 688);
      Self.Terminale.TabIndex := 0;
      //
      // TWinForm
      //
      Self.AutoScaleBaseSize := System.Drawing.Size.Create(5, 13);
      Self.ClientSize := System.Drawing.Size.Create(1024, 741);
      Self.Controls.Add(Self.Terminale);
      Self.Font := System.Drawing.Font.Create('Microsoft Sans Serif', 8.25, 
    System.Drawing.FontStyle.Regular,
          System.Drawing.GraphicsUnit.Point, (Byte(255)));
      Self.Name := 'TWinForm';
      Self.Text := 'WinForm';
      Include(Self.Load, Self.TWinForm_Load);
      (System.ComponentModel.ISupportInitialize(Self.Terminale)).EndInit;
      Self.ResumeLayout(False);
    end;
    {$ENDREGION}
    
    procedure TWinForm.Dispose(Disposing: Boolean);
    begin
      if Disposing then
      begin
        if Components <> nil then
          Components.Dispose();
      end;
      inherited Dispose(Disposing);
    end;
    
    constructor TWinForm.Create;
    begin
      inherited Create;
      //
      // Required for Windows Form Designer support
      //
      InitializeComponent;
      //
      // TODO: Add any constructor code after InitializeComponent call
      // prendo Handle della finestra e lo passo alla unit(procedura 
    GET_HANDLE(handle)...
    //
    end;
    
    procedure TWinForm.TWinForm_Load(sender: System.Object; e: 
    System.EventArgs);
    
    var HH : cardinal;
    var HOURS: String;
    begin
        HH:=4294967295;      // max valore consentito x un cardinale
      CARD_TO_S(HH,HOURS);       // procedure
        MyWriteln(['HOURS=',HOURS]);
    end;
    end.
    Il problema è che il compilatore non mi da alcun errore, però ottengo un risultato che non è quello che mi aspetto.
    HOURS=?????
    Tra l'altro se eseguo la DLL in debug, non riesco a vedere che valori assumono i miei dati.
    ...NO ONE IS INNOCENT ANYMORE...

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da rotteninside
    Ciao, allora ho provato a fare una .NET DLL, e l'ho richiamata dal form .NET, scrivendo questo codice [...]
    Lo sviluppo su .NET Framework non si basa sugli stessi principi dello sviluppo su Win32; peraltro, alcuni meccanismi sono funzionali solamente se si usa VCL o VCL.NET, come nel caso delle librerie DLL per .NET.

    Per ottenere una libreria (assembly DLL) "pura" è necessario realizzare un package.

    Evita l'uso di funzioni "vaganti" nella unit e, invece, crea delle classi con metodi statici (class procedure).

    Senza questi accorgimenti, non si sfrutta il .NET Framework per i servizi che effettivamente fornisce e si rischia solamente di incappare in effetti collaterali.

    Suggerisco anche di documentarsi molto attentamente sull'architettura stessa del framework, è molto importante per poter sviluppare applicazioni che funzionino bene.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.