2013-10-16 3 views
0

Ceci est mon code dll non géré C++.Pourquoi ByRef donne une exception lors du passage au code non managé?

void Only(char *a) 
{ 
    *a++ = 'p'; 
    *a++ = 'r'; 
    *a++ = 'a'; 
    *a++ = 'n'; 
    *a++ = 'i'; 
    *a++ = 0; 
} 

Le fichier .DEF est utilisé pour exporter des symboles.

J'ai utilisé la fonction application uniquement VB.Net comme suit,

Declare Sub Only Lib "dllproj2.dll" Alias "Only" (b As StringBuilder) 
.... 
Dim s As StringBuilder = New StringBuilder() 
Only(s) 

Il fonctionne très bien. Mais lorsque j'essaie d'utiliser b comme ByRef comme suit,

Declare Sub Only Lib "dllproj2.dll" Alias "Only" (ByRef b As StringBuilder) 

Il donne l'exception montrée dans l'image.

enter image description here

Je ne comprends pas pourquoi. ByRef n'est-il pas plus approprié ici?

Merci.

+1

Il est difficile de voir comment cela pourrait fonctionner de façon fiable. Comment la classe 'StringBuilder' peut-elle connaître le volume de stockage requis par la fonction C++? –

+0

@JonathanPotter Quelle devrait être la solution à cela? Et comment supprimer ByRef le fait fonctionner? –

Répondre

2

Il doit être ByVal. La fonction ne remplacera pas la référence StringBuilder elle-même. Il va plutôt mettre à jour le contenu du StringBuilder. (Voir here pour une question similaire.)

Questions connexes