[ Cola @ 12.06.2007. 19:21 ] @
Kao prvo da vas pozdravim :)
Imam par pitanja (kao sto pise u naslovu)

Zanima me

1 kako se u builderu prave dll fjlovi

volio bi kratak kod ako moze npr dll koji primi
dva AnsiStringa a i b i vrati nezultat a+b
primer je besmislen ali cisto da vidim kako
to radi tj kod koji treba da se pise u daj dll

2 kako da se taj dll pozove iz nekog programa

takodje voleo bi kod :)

3 kako u builderu da preko FTPa prebacijemo fajlove

kratak kod ili upustvo :) naravno za frp koristim sa usernem i passwordom pored ipa i porta



hvala unapred svima
[ X Files @ 12.06.2007. 20:12 ] @
Citat:

1 kako se u builderu prave dll fjlovi

Postoji DLL Wizzard (File > New > Other > DLL Wizzard).

Citat:

volio bi kratak kod ako moze npr dll koji primi dva AnsiStringa a i b i vrati nezultat a+b
primer je besmislen ali cisto da vidim kako to radi tj kod koji treba da se pise u daj dll

Iako taj DLL Wizzard nudi da biraš mogućnost korišćenja VCL-a, odnosno AnsiString-ova,
po nekim preporukama ja samo koristim čist API kada su u pitanju DLL-ovi.

Citat:

2 kako da se taj dll pozove iz nekog programa

Samo dodaš LIB fajl koji se dobije uz Buildovanje DLL-a, i posle koristiš funkcije po želji.

Citat:

takodje voleo bi kod :)

1. napravi ručno jedan Header fajl i snimi ga u neki glavni Projektni folder:
--- DLL.H ---
Code:

#ifndef DllH
#define DllH

  #ifdef BUILDING_DLL
    #define MY_FUNC __declspec(dllexport)
  #else
    #define MY_FUNC __declspec(dllimport)
  #endif

  #ifdef __cplusplus
    extern "C" {
  #endif

  MY_FUNC int __stdcall Zbir( int X,int Y );

  #ifdef __cplusplus
    }
  #endif

#endif

2. Pokreni DLL Wizzard
3. Dodaj kod (otprilike ovako):
Code:

#include <windows.h>
#define BUILDING_DLL
#include "Dll.h"
#pragma argsused
int __stdcall Zbir( int X, int Y )
{
    return ( X + Y );
}

4. Snimi, Builduj, u folderu bi trebalo da imas i DLL i LIB
5. Napravi normalnu Windows Forms aplikaciju (snimi recimo isto gde i DLL).
6. Dodaj LIB od DLLa u Projekat (Add to Project...)
7. Kod po želji:
Code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ShowMessage( Zbir( 2, 3 ) );        
}

Eto, otprilike tako, netestirano... nadam se da nisam nešto ispustio.

Citat:

3 kako u builderu da preko FTPa prebacijemo fajlove
kratak kod ili upustvo :) naravno za frp koristim sa usernem i passwordom pored ipa i porta

Novo pitanje uvek postavi u novoj temi.

Postoji neka NMFTP komponenta u okviru (Net Masters komponenti), a takodje postoji i IdFTP u okviru
Indy seta. Nisam ih nikada koristio, ali pretpostavljam da je potrebno samo podesavati propertije.

P.S.

Vezano za DLL-ove. Obavezno skini:
http://www.frasersoft.net/program/bcbdev.zip
i u sekciji (ako se dobro sećam) Articles imaš jedan od boljih tutorijala vezanih za DLLove i sve
probleme na koje možeš naići pri portovanju MS/Borland DLL-ova.
[ Cola @ 13.06.2007. 01:55 ] @
hvala dll proradio samo je trebalo u koraku 7.
Code:
#include "dll.h"

[ Cola @ 15.06.2007. 23:35 ] @
Sve je ovo super i ok ali sto se tice dll-ova nesto mi nije jasno

Napravio sam klasu (npr nek se zove TTest) koja moze da ima samo jednu instancu, tj singleton
Code:
  
class TTest{
private:
       static TTest *instance;
       TTest();   
       ...
public:
       TTest * getInstance();
       ...
};


Code:

TTest *TTest::instance = NULL;

TTest *TTest:: getInstance(){
       if(!instance)
              instance = new TTest();
       return instance;
}


sad sledi pitanje ako vec POSTOJI instanca klase TTest zasto kada pozivam iz DLLa getInstance() i prolazim kroz kod vidim da je vrednost instance jednaka NULL
[ X Files @ 16.06.2007. 10:11 ] @
Najbolje pokaži ceo kod (izbaci sve suvišno), pa da vidimo čemu je reč, ovako je sve nagađanje.

Dakle, onaj DLL header fajl bi trebao da budeo otprilike ovako
(mislim da si zaboravio da staviš i static na getInstance() ):
Code:

#ifndef DllH
#define DllH

  #ifdef BUILDING_DLL
    #define MY_FUNC __declspec(dllexport)
  #else
    #define MY_FUNC __declspec(dllimport)
  #endif

  #ifdef __cplusplus
    extern "C" {
  #endif

  class MY_FUNC TTest
  {
       public:
       static TTest *instance;
       static TTest * getInstance();
       // ...
  };

  #ifdef __cplusplus
    }
  #endif

#endif


DLL Source:
Code:

TTest *TTest::instance = NULL;

TTest *TTest::getInstance()
{
   if ( !instance )
      instance = new TTest();
   return instance;
}

int WINAPI DllEntryPoint( HINSTANCE hinst, unsigned long reason, void *lpReserved )
{
   TTest *test;
   test = TTest::getInstance();
   return TRUE;
}


Ovde bi valajlo i DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, ali to je već neka druga priča.

A na strani Form1:

Code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ShowMessage( (long)(TTest::instance) );
}