+ Rispondi
Risultati da 1 a 8 di 8

Discussione: [Win32] Libreria statica in una DLL

  1. #1
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    4

    [Win32] Libreria statica in una DLL

    Ciao a tutti.
    Sono un principiante e mi sono imbattuto nell'errore LNK2005 che non mi fa andare avanti.

    Sto cercando di realizzare una DLL per poterla utilizzare in Visual basic seguendo le indicazioni di un articolo di Antonio Giuliana (http://www.visual-basic.it/articoli/agVB_VC.htm).

    L'obiettivo è infatti utilizzare (da VB) codice C realizzato da Dallas che mette a disposizione una libreria statica (owlib.lib) usata in molti esempi SDK (1-Wire) compilati ed eseguiti con VC6 con successo.

    Al momento di inserirla nella dll per VB, VC si rifiuta di compilare riportando l’errore LNK2005 e denunciando la duplicazione della funzione DllMain.
    Premesso che l’articolo Q148652 non ha risolto il problema, praticamente sono nei guai.

    Ringrazio vivamente chi vorrà aiutarmi.


  2. #2
    Moderatore Globale L'avatar di AntonioGiuliana
    reputazione complessiva: 38 38

    Messaggi
    6,737
    Ciao,

    mi fa piacere che tu abbia letto il mio articolo ma forse c'e' qualcosa che non va.

    Non ha senso "inserire" una libreria .lib in una DLL (e fa bene il VC ad arrabbiarsi ... ) ...

    Fammi capire bene cosa vuoi fare, magari con un esempio di codice, e ne parliamo.
    Ultima modifica di bottomap; 27-06-2007 alle 19:37
    Antonio GIULIANA

  3. #3
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    4
    Ma ho capito male o tu hai i sorgenti della OWLIB?
    Grazie Antonio, si, ho i sorgenti di OWLIB ( iButton - Contact Memory, Digital Temperature Data Loggers, Java-powered and Secure eCash Tokens - Maxim/Dallas, file: multiVC300.zip).
    mi fa piacere che tu abbia letto il mio articolo ma forse c'e' qualcosa che non va.
    Niente affatto. Nel senso che l'articolo è talmente ben documentato che sono riuscito, con mia meraviglia e senza troppe difficoltà, a trasformare il tuo esempio da C++ a C (gli esempi di Dallas sono in C).

    L'unico problema è stato il passaggio di parametri di tipo UDT contenenti elementi boolean (nell'articolo fatti corrispondere a long anziché a short).

    Non ha senso "inserire" una libreria .lib in una DLL (e fa bene il VC ad arrabbiarsi)
    Sono un principiante, misero me! Tieni conto che mi sono arrabbiato anch'io e parecchio (insensibile VC!).
    Provengo dal mondo VB e non ho potuto evitare l'ingenuità di applicare una evidentemente erronea deduzione da 'vubbista'.
    Però dovresti spiegarmi perché VC si arrabbia. In realtà l'ho molestato per dargli lavoro (programmazione 'creativa', ma anche per risparmiarmi la traduzione a VB, per me proibitiva: spero però che non finisca come la finanza creativa!).

    Fammi capire bene cosa vuoi fare, magari con un esempio di codice, e ne parliamo.
    Si, grazie: ma ti basterà un solo post per correggere il copia e maleincolla dal tuo articolo?

    Esempio di funzione nella DLL il cui scopo è quello di interrogare la rete 1-Wire e riempire un array di stringhe per VB contenenti ciascuna l'identificativo in esadecimale di ciascun dispositivo rilevato (C3081 è la mia/tua dll):
    Codice:
    DWORD _stdcall GetDevicesList(SAFEARRAY **par)
    {
      int rslt,cnt,ret=1;
      int portnum=0;
      uchar SNum[8];
     //char *port_zstr="{1,5}";
     unsigned char buffer[16];
     long l=1;
     BSTR bstrElement;
    
     __try 
     {
      
      char *port_zstr=*m_InitString;
    SAFEARRAYBOUND sab[] = { 0, 1 }; 
      SAFEARRAY *psa = SafeArrayCreate(VT_BSTR, 1, sab);
    
      if (!m_Initialized) RaiseException(C3081_ERR_NOT_INITIALIZED,0,0,NULL);
    
      if (!psa) RaiseException(C3081_ERR_INTERNAL,0,0,NULL);
    
      if((portnum = owAcquireEx(port_zstr)) < 0)
    RaiseException(C3081_ERR_TMEX,0,0,NULL);
      
      cnt = 0;
      bstrElement = SysAllocStringByteLen("ZZZZZZZZZZZZZZZZ", 16);
      // find the first device (all devices not just alarming)
      rslt = owFirst(portnum, TRUE, FALSE);
      while (rslt)
      {
    owSerialNum(portnum,&SNum[0],TRUE);
    PrintSerialNum(&SNum[0]);
    ROMToHexString(SNum,buffer);
    strcpy((char *)bstrElement,buffer);
    sab->cElements++;
    SafeArrayRedim(psa,sab);
    SafeArrayPutElement(psa, &l, bstrElement); 
    l++;
    
    // find the next device
    rslt = owNext(portnum, TRUE, FALSE);
      }
    
      SysFreeString(bstrElement);
    
      // release the 1-Wire Net
      owRelease(portnum);
    
      *par=psa;
      return C3081_ERR_SUCCESS;
      }
    
      __except(EXCEPTION_EXECUTE_HANDLER)
      {
      return GetExceptionCode();
      }
    
    }
    owAcquireEx è una funzione presente nella libreria OWLIB che, dopo vari passaggi, giunge al sodo nel modo seguente:
    Codice:
    SMALLINT OpenCOM(int portnum, char *port_zstr)
    {
    char tempstr[80];
    short fRetVal;
    COMMTIMEOUTS CommTimeOuts;
    DCB dcb;
    
    if(!ComID_init)
    {
    int i;
    for(i=0; i<MAX_PORTNUM; i++)
      ComID[i] = 0;
    ComID_init = 1;
    }
    
    OWASSERT( portnum<MAX_PORTNUM && portnum>=0 && !ComID[portnum],
      OWERROR_PORTNUM_ERROR,  FALSE );
    
    // open COMM device
    if ((ComID[portnum] =
    CreateFile( port_zstr, GENERIC_READ | GENERIC_WRITE,
      0,
     
      NULL,  //  no security attrs
      OPEN_EXISTIN G,
      FILE_FLAG_OV ERLAPPED, // overlapped I/O
      NULL  )) == (HANDLE) -1 )
    {
    ComID[portnum] = 0;
     OWERROR(OWERROR_GET_SYST EM_RESOURCE_FAILED);
    return (FALSE) ;
    }
    else
    {
    // create events for detection of reading and write to com port
     sprintf(tempstr,"COMM_RE AD_OVERLAPPED_EVENT_FOR_%s",port_zstr);
     
    osRead[portnum].hEvent = CreateEvent(NULL,TRUE,FALSE,tempstr);
     sprintf(tempstr,"COMM_WR ITE_OVERLAPPED_EVENT_FOR_%s",port_zstr);
     
    osWrite[portnum].hEvent = CreateEvent(NULL,TRUE,FALSE,tempstr);
    
    // get any early notifications
    SetCommMask(ComID[portnum], EV_RXCHAR | EV_TXEMPTY | EV_ERR | EV_BREAK);
    
    // setup device buffers
    SetupComm(ComID[portnum], 2048, 2048);
    
    // purge any information in the buffer
    PurgeComm(ComID[portnum], PURGE_TXABORT | PURGE_RXABORT |
       PURGE_TXCLEAR  | PURGE_RXCLEAR );
    
    // set up for overlapped non-blocking I/O
     CommTimeOuts.ReadInterva lTimeout = 0;
     CommTimeOuts.ReadTotalTi meoutMultiplier = 20;
     CommTimeOuts.ReadTotalTi meoutConstant = 40;
     CommTimeOuts.WriteTotalT imeoutMultiplier = 20;
     CommTimeOuts.WriteTotalT imeoutConstant = 40;
    SetCommTimeouts(ComID[portnum], &CommTimeOuts);
    
    // setup the com port
    GetCommState(ComID[portnum], &dcb);
    
    dcb.BaudRate =  CBR_9600;   // current baud rate
    dcb.fBinary =  TRUE;  // binary mode, no EOF check
    dcb.fParity =  FALSE;  // enable parity checking
    dcb.fOutxCtsFlow =  FALSE; //  CTS output flow control
    dcb.fOutxDsrFlow =  FALSE; //  DSR output flow control
    dcb.fDtrControl = DTR_CONTROL_ENABLE;  // DTR flow control type
    dcb.fDsrSensitivity =  FALSE; // DSR sensitivity
    dcb.fTXContinueOnXoff =  TRUE; // XOFF continues Tx
    dcb.fOutX =  FALSE;  // XON/XOFF out flow control
    dcb.fInX =  FALSE;   // XON/XOFF in flow control
    dcb.fErrorChar =  FALSE;   // enable error replacement
    dcb.fNull =  FALSE;  // enable null stripping
    dcb.fRtsControl = RTS_CONTROL_ENABLE;  // RTS flow control
    dcb.fAbortOnError =  FALSE; // abort reads/writes on error
    dcb.XonLim =  0;  // transmit XON threshold
    dcb.XoffLim =  0;    // transmit XOFF threshold
    dcb.ByteSize =  8;   // number of bits/byte, 4-8
    dcb.Parity =  NOPARITY; //  0-4=no,odd,even,mark,space
    dcb.StopBits =  ONESTOPBIT; //  0,1,2 = 1, 1.5, 2
    dcb.XonChar =  0;    // Tx and Rx XON character
    dcb.XoffChar =  1;   // Tx and Rx XOFF character
    dcb.ErrorChar =  0;  // error replacement character
    dcb.EofChar =  0;    // end of input character
    dcb.EvtChar =  0;    // received event character
    
    fRetVal = SetCommState(ComID[portnum], &dcb);
    }
    
    // check if successfull
    if (!fRetVal)
    {
    CloseHandle(ComID[portnum]);
    CloseHandle(osRead[portnum].hEvent);
    CloseHandle(osWrite[portnum].hEvent);
    ComID[portnum] = 0;
     OWERROR(OWERROR_SYSTEM_R ESOURCE_INIT_FAILED);
    }
    
    return (fRetVal);
    
    }

    Mi scuso per la lunghezza del post, sono comunque disponibile ad inviarti il malloppo.

    Grazie

    Ma che ore sono? Accidenti...
    Ultima modifica di bottomap; 15-06-2007 alle 00:22

  4. #4
    Moderatore Globale L'avatar di AntonioGiuliana
    reputazione complessiva: 38 38

    Messaggi
    6,737
    Come ti ho detto in un'altra risposta, ho dato un'occhiata ai sorgenti della owlib.lib e ho creato una owlib.dll.

    Su questa puoi inserire il tuo codice.

    Se vuoi mandami il malloppo e ti faccio un esempio.

    Se non ti dispiace, infine, preferirei continuare il discorso su questo forum ...
    Antonio GIULIANA

  5. #5
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    4
    Cari Antonio (sic),
    con il vostro suggerimento ho fatto un grosso passo avanti.

    Grazie, grazie, grazie...

    Allo stato, la funzione GetDevicesList sembra comportarsi secondo le aspettative con un adattatore seriale.

    Sto lavorando per 'implementare' le funzioni presenti in humalog.c.

    Vorrei però approfittare della disponibilità di Antonio Giuliana, affinché desse un'occhiata al malloppo, che ho provato ad inviargli in privato, ma l'indirizzo giuliana_a@visual-basic.it non risulta valido.

    Potrebbe egli fornirmene uno alternativo?


    Giuseppe Bondì



  6. #6
    Moderatore Globale L'avatar di AntonioGiuliana
    reputazione complessiva: 38 38

    Messaggi
    6,737
    Sì ... problemi di SPAM ... usa questo indirizzo

    antonio.giuliana AT visual-basic.it
    Antonio GIULIANA

  7. #7
    Moderatore Globale L'avatar di AntonioGiuliana
    reputazione complessiva: 38 38

    Messaggi
    6,737
    Ricevuto ... su cosa vuoi un aiuto in particolare?
    Antonio GIULIANA

  8. #8
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    4
    Avere un chiarimento su:

    1) Perché non ha senso inserire un file .LIB in una DLL (essendo l'obiettivo quello di utilizzare una libreria da un'altra) e quale è l'alternativa (a parte la soluzione adottata in questo caso). La trasformazione da statico a dinamico?

    2) Il corrispettivo, se esiste, di DllMain in una libreria statica.

    3) Passaggio di tipi boolean da VB a VC (è corretto short?).

    3) La correttezza dell'uso di SafeArrayRedim in GetDevicesList, tenendo conto che l'intenzione è tradurre il Redim Preserve di VB.

    Ciao e grazie

+ Rispondi

Discussioni Simili

  1. Risposte: 1
    Ultimo Messaggio: 11-05-2006, 10:58
  2. [ASP]Libreria non registrata
    Di paolo_PK nel forum ASP 3.0, ASP .Net
    Risposte: 1
    Ultimo Messaggio: 01-03-2006, 23:13
  3. Errore mancanza libreria
    Di Orso 33 nel forum MS Office, Access, VBA
    Risposte: 2
    Ultimo Messaggio: 23-12-2005, 14:57
  4. [C/C++] Header Mouse.h
    Di lupen nel forum C/C++
    Risposte: 1
    Ultimo Messaggio: 08-11-2005, 23:53
  5. Libreria vb
    Di zurlina nel forum Visual Basic 6
    Risposte: 2
    Ultimo Messaggio: 25-10-2005, 19:27

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi