2009-10-02 5 views
0

Je souhaite utiliser la commande Run("someProgram.exe") en utilisant le langage BASIC. Cela va ouvrir le 3ème programme d'application.Comment faire pour exécuter le programme .dll?

Si ce programme s'exécutant en utilisant .dll (pas sûr si possible) pas .exe, comment puis-je coder cela?

merci d'avance.

+0

Vous "n'exécutez pas" de DLL, ce sont juste des bibliothèques qui peuvent être liées dynamiquement et appelées à partir de votre code –

+0

lol @ question. –

Répondre

4

Si vous voulez exécuter une fonction DLL à partir de la ligne de commande, utilisez: Rundll.exe

Notez que votre fonction exportée doit correspondre exactement à la signature (C):

void CALLBACK EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow); 

Si tel est le non, il n'est pas défini quant à ce qui va arriver, mais vous allez probablement tomber en panne. La routine normale pour appeler des fonctions arbitraires de DLL dans la classe VB est d'utiliser l'instruction Declare. Vous devez connaître la signature de la fonction que vous souhaitez appeler lors de la compilation.

Par exemple:

Declare Function GetUserName Lib "advapi32.dll" Alias _ 
"GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer 
Function GetUser() 
    Dim RetVal As Integer 
    Dim UserName As String 
    Dim Buffer As String 
    Buffer = New String(CChar(" "), 25) 
    RetVal = GetUserName(Buffer, 25) 
    UserName = Strings.Left(Buffer, InStr(Buffer, Chr(0)) - 1) 
    MsgBox(UserName) 
End Function 

Ce code appelle la fonction "GetUserNameA" de advapi32.dll. Il existe de nombreux sites consacrés à la liste de la syntaxe Declare pour les fonctions de fenêtres arbitraires, de sorte qu'il n'est généralement pas difficile de trouver la bonne.

+1

Rundll.exe est utilisé pour invoquer des fonctions exportées à partir de DLL (correspondant à une certaine signature) - ce n'est pas vraiment ce que la question est après –

+1

1800: En fait, je pense que vous vous trompez. Il demande d'exécuter une DLL en tant qu'application, c'est ce que permet Rundll. Évidemment, il peut aussi l'appeler dans la langue en le chargeant, mais ce n'est pas ce qu'il demande. –

+1

Ce n'est toujours pas une méthode générale pour appeler des fonctions exportées à partir de DLL. Uniquement si la fonction exportée correspond à la signature: void CALLBACK EntryPointW (HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow); cela va-t-il fonctionner? –

2

Il est difficile de répondre sans comprendre la nature de votre fichier .dll. Bien sûr, il n'y a aucun moyen de simplement faire apparaître votre dll dans un harnais et s'attendre à ce qu'il fonctionne. Ça devrait être un exe pour ça. Vous pouvez créer votre propre shell/wrapper exe qui agit simplement comme un hôte de processus avec un point d'entrée, puis déclenche des méthodes sur la DLL.

Je ne sais pas si cela correspondrait à votre modèle, mais si vous étiez dans la position où vous pouvez exiger que ces DLL contiennent une classe qui implémente une interface. Dire IRunnable qui contient une seule méthode Run(). Vous pouvez créer un exe qui reçoit la dll en tant qu'argument de ligne de commande, utilise la réflexion pour trouver IRunnable, puis charge cette classe et appelle Run().

Questions connexes