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

    [VB.net] Puntatore a char?

    Ave! Ho programmato in C++ una DLL con una funzione che vuole un parametro di tipo char*
    paradigma:
    codice:
    void Funzione(char* parametro);
    Vorrei utilizzare questa funzione in vb net. Dovrei quindi convertire variabili da String a char*
    per darle in pasto alla funzione.
    Questo è come carico la funzione dalla DLL:
    codice:
    Public Declare Function Funzione Lib "Engine.dll" Alias "Funzione" (ByRef Param As Char)
    Quindi la utilizzo, in vb net, in questo modo:
    codice:
    Dim a As String = "Ciaoo"
    Funzione(a.ToCharArray())
    m da qualche errore incomprensibile quando richiamo Funzione.
    Dove sbaglio?

  2. #2
    La funzione in questione riceve la stringa come parametro e non la modifica oppure la cambia e il chiamante deve poter vedere la stringa modificata?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Che differenza fa? Cmq vorrei poter fare qualunque genere di operazione sulla stringa, anche allungarla spostando la null-terminazione.

    La funzione corrente non modifica la stringa, la scrive solo su un file testuale, ma come ho detto vorrei in seguito anche poterla modificare

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Se non ricordo male, per il passaggio di buffer di caratteri a funzioni API si utilizza la classe StringBuilder.

    Proverei a fare qualche ricerca in merito.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    StringBuilder ha pochi metodi, il più attinente all'argomento mi sembra essere chars, che dovrebbe ritornare un carattere della stringa (cosi passo come argomento il primo) solo che continua a darmi errori..
    E' così difficile in VB net lavorare con array di caratteri?

  6. #6
    Il punto è che il modello di stringa .NET non c'entra niente con quello del C; in .NET una stringa è una sequenza immutabile di caratteri Unicode, per cui non puoi passarla come se nulla fosse ad una funzione C che si aspetta un qualche genere di buffer di char. Per questo motivo, il marshaling delle stringhe da mondo managed a mondo unmanaged non è semplicissimo; leggi qui e qui.

    In ogni caso, di base la cosa più semplice se la stringa viene modificata è passare uno by value uno StringBuilder (dimensionato opportunamente), impostando il flag Ansi alla Declare.
    Se invece la stringa non viene modificata basta una semplice String passata by value (sempre marcando la Declare come Ansi).

    Per inciso, la cosa migliore sarebbe che la funzione C lavorasse direttamente in Unicode (wchar_t *), in modo da evitare la perdita di informazioni che si ha nel convertire in Ansi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Originariamente inviato da VisRoboris
    StringBuilder ha pochi metodi
    Non capisco cosa c'entri quanti metodi ha StringBuilder con il passaggio di valori a una funzione...
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.