Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-10-2006, 12:35   #1
ohmimmo
Junior Member
 
Iscritto dal: Oct 2006
Messaggi: 4
[Dll.... fatta in c++(Builder) richiamata in pascal(Delphi)]

Ciao a tutti, sono uno studente universitario ed ho un piccolo problema nel richiamare le funzioni contenute in una DLL fatta in C++ (CBuilder6) con una applicazione scritta in Pascal (Delphi6).
Di seguito riporto il codice scritto:

#### file StaticLd.h #####################################
#ifndef _STATICLD_H
#define _STATICLD_H

#if defined __DLL__
# define DLL_EXP __declspec(dllexport)
#else
# define DLL_EXP __declspec(dllimport)
#endif

//------------------------------------------------------------------------

extern "C" void DLL_EXP Saluti(HWND);
//------------------------------------------------------------------------

class DLL_EXP NomeClasse
{
public:
NomeClasse(HWND hwnd);
void FaQualcosa(char* text);
void Beep();
private:
HWND hWnd;
};
//------------------------------------------------------------------------
#endif
####################################################
###
###
#### file StaticLd.cpp ####################################
//------------------------------------------------------------------------
#include <condefs.h>
#include <windows.h>
//------------------------------------------------------------------------

#pragma argsused
#include "StaticLd.h"

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{

return 1;
}
//------------------------------------------------------------------------
void DLL_EXP Saluti(HWND hWnd)
{
MessageBox(hWnd, "Saluti da una funzione della DLL!", "Messaggio 1 per Filice",
MB_OK | MB_ICONEXCLAMATION);
}
//------------------------------------------------------------------------
NomeClasse::NomeClasse(HWND hwnd)
{
hWnd=hwnd;
}
//------------------------------------------------------------------------
void NomeClasse::FaQualcosa(char* text)
{
MessageBox(hWnd, text, "Messaggio 2 per Filice",MB_OK);
}
//------------------------------------------------------------------------
void NomeClasse::Beep()
{
MessageBeep(-1);
}
//------------------------------------------------------------------------


Questa libreria chiamata in un'applicazione c++ funziona perfettamente.
Riporto di seguito la Unit chiamante, composta da un Form con due pulsanti:


#### file CallDll_Unit.h ####################################
//------------------------------------------------------------------------
#ifndef CallDll_UnitH
#define CallDll_UnitH
//------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//------------------------------------------------------------------------
#endif
####################################################
###
###
#### file CallDll_Unit.cpp ##################################
//------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "CallDll_Unit.h"
#include "StaticLd.h"
//------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Saluti(Handle);
}
//------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
NomeClasse mc(Application->Handle);
mc.FaQualcosa("Saluti da una funzione di una Classe della DLL!");
mc.Beep();
}
//------------------------------------------------------------------------
//##################################################

Mentre nel modulo in pascal, il compilatore non da nessun messaggio di errore però quando lo eseguo da il messaggio:

" Impossibile trovare il punto di ingresso Saluti della procedura nella libreria di collegamento dinamico PrjStaticLd.dll."

Riporto di seguito la Unit dell'applicazione chiamante in Pascal
(approposito, mi limito a chiamare solo la funzione Saluti(.......)):

#### file CallDllU.pas ####################################
unit CallDllU;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var

//-- fatta in CBuilder6 -----------------
procedure Saluti(hWnd : HWND ); external 'PrjStaticLd.dll';
//---------------------------------------

implementation {$R *.dfm}
//##################################################
//------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
Saluti(Handle);
end;

//------------------------------------------------------------------------
//##################################################
end.

So dell'esistenza dei modificatori "cdecl, pascal ecc..." per la compatibilità delle librerie ma non trovo materiale per studiarne il significato.
Spero che qualcuno mi risponderà.... aiutooooooooo!!!!!!!!!
ohmimmo è offline   Rispondi citando il messaggio o parte di esso
Old 29-10-2006, 12:56   #2
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
un po' ovunque: quelli del compilatore Microsoft per esempio ovviamente sono documentati su MSDN. te ne riassumo brevemente le caratteristiche:

__stdcall - i parametri vengono messi (PUSH) nello stack da destra a sinistra, il cleanup viene fatto dal chiamato

__cdecl - parametri messi da sinistra a destra, cleanup da parte del chiamante; permette di realizzare funzioni "vararg" (ellissi come ultimo "parametro" nel prototipo), al contrario di __stdcall che non lo permette

__fastcall - utilizza i registri general purpose anziché lo stack per passare i primi parametri; se la funzione ha pochi parametri e non usa variabili locali non sarà necessario creare lo stack frame

poi esistono anche __pascal, __fortran e __syscall, ma sono obsolete percui non le usare.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-10-2006, 10:28   #3
ohmimmo
Junior Member
 
Iscritto dal: Oct 2006
Messaggi: 4
[Grazie... ma mi servirebbero ulteriori informazioni]

Quote:
Originariamente inviato da 71104
un po' ovunque: quelli del compilatore Microsoft per esempio ovviamente sono documentati su MSDN. te ne riassumo brevemente le caratteristiche:

__stdcall - i parametri vengono messi (PUSH) nello stack da destra a sinistra, il cleanup viene fatto dal chiamato

__cdecl - parametri messi da sinistra a destra, cleanup da parte del chiamante; permette di realizzare funzioni "vararg" (ellissi come ultimo "parametro" nel prototipo), al contrario di __stdcall che non lo permette

__fastcall - utilizza i registri general purpose anziché lo stack per passare i primi parametri; se la funzione ha pochi parametri e non usa variabili locali non sarà necessario creare lo stack frame

poi esistono anche __pascal, __fortran e __syscall, ma sono obsolete percui non le usare.
//-------------------------

Per prima cosa grazie per avermi risposto.
Il problema è che sono nuovo nella creazione delle dll e forse anche una stupidagine mi blocca, non riesco a capire perche durante l'esecuzione l'applicazione non trova il punto di ingresso alla funzione nella dll.
Se ti và, potresti guardare il codice? Non è tanto, è solo un esempietto che ho preparato per l'occasione.
ohmimmo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:43.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v