2009-12-29 3 views
0

J'ai fait une application et une DLL, qui fonctionnent de cette façon: Je dois enregistrer la DLL. Après avoir enregistré la DLL si je fais un clic droit sur un fichier .exe, le menu pop-up apparaît, et j'ai inséré dans ce menu une ligne ("Start MyApp"), et si je clique là, il devrait démarrer MyApp. MyApp a un paramètre qui est le chemin complet du fichier .exe sélectionné. Après avoir démarré MyApp avec ce chemin, il devrait créer un processus avec CreateProcessWithLogonW(). Cette application lit le nom d'utilisateur, mot de passe et le domaine à partir d'un fichier .ini. Mon problème est qu'après le démarrage de MyApp, il échoue toujours, car il ne trouve pas le fichier ini. Le code d'erreur est: 1 (fonction incorrecte). Si je démarre MyApp manuellement, cela fonctionne correctement.Démarrage d'un programme échoue avec le code d'erreur 1

Est-ce que quelqu'un a une idée pourquoi est-ce, et comment pourrais-je résoudre ce problème?

Merci d'avance!

Kampi

Update1:

Voici le code qui lit le fichier ini.

int main (int argc, char *argv[]) 
{  
    int i, slash = 0, j; 
    char application[size]; 
    wchar_t wuser[65], wdomain[33], wpass[129]; 

    memset(user, 0, sizeof (user)); 
    memset(password, 0, sizeof (password)); 
    memset(domain, 0, sizeof (domain)); 

    file_exists("RunAs.ini"); 
    readfile("RunAs.ini"); 
    .... 
    .... 
    .... 
} 
void file_exists(const char * filename) 
{ 
    if (FILE * file = fopen(filename, "r")) 
    { 
     fclose(file); 
    } 
    else 
    { 
     printf("\nCan't find %s!\n",filename); 
     getch(); 
     exit(1); 
    } 
}//file_exists  

void readfile(char * filename) 
{ 
    FILE *inifile; 
    char tmp[256], buf[256], what[128]; 
    int i, j; 

    inifile = fopen("RunAs.ini", "r"); 

    while (fgets(tmp, sizeof tmp, inifile) != NULL) 
    {  
     if (tmp[ strlen(tmp) - 1 ] == '\n') 
     { 
      tmp[ strlen(tmp) - 1 ] = '\0'; 
     }//if 

     memset (buf, 0, sizeof(buf)); 

     for (i = 0; tmp[i]!= '='; i++) 
     { 
      buf[i] = tmp[i]; 
     } 
     buf[i] = '\0'; 
     i++; 

    // memset (what, 0, sizeof(what)); 
     SecureZeroMemory(what, sizeof(what) * 128); 

     for (j = 0; i != strlen(tmp); i++) 
     { 
      what[j] = tmp[i]; 
      j++; 
     } 
     what[j] = '\0'; 
     upcase(buf); 
     removespace(what); 

     if (strcmp(buf, "USERNAME") == 0) 
     { 
      strcpy(user, what); 
     } 
     if (strcmp(buf, "PASSWORD") == 0) 
     { 
      strcpy(password, what); 
     } 
     if (strcmp(buf, "DOMAIN") == 0) 
     { 
      strcpy(domain, what); 
     } 
    }//while 
    fclose (inifile); 

}//readfile 
+1

Vous devez montrer votre code qui ouvre/lit depuis le fichier ini. Sans cela, vous n'avez fourni aucune information qui vous sera utile pour trouver le problème. –

+0

@Ken: Code posté :) Mais je dois dire, que si je démarre l'application directement, comme "myapp.exe c: \ totalcmd \ totalcmd.exe" que cela fonctionne bien.Il ne fonctionne pas seulement quand je commence à partir du menu contextuel. – kampi

Répondre

3

Comme d'autres l'ont dit, votre problème est ici.

file_exists("RunAs.ini"); 
readfile("RunAs.ini"); 

appels Ni la fonction fournit un chemin. Vous attendez que le répertoire de travail actuel soit le dossier dans lequel se trouve votre application, mais ce n'est pas obligatoire (en fait, vous ne devriez jamais supposer que c'est le cas). Le menu contextuel ne définit pas le répertoire de travail en premier. Votre pari le plus sûr est de récupérer le chemin de votre dossier en utilisant le chemin fourni dans argv [] (le 0e élément est le chemin complet et le nom de l'application elle-même, et vous pouvez en extraire le chemin).Vous aurez alors une connaissance exacte de l'emplacement du fichier et pourrez ajouter le nom du fichier ini à ce chemin.

+0

@Ken: Vous avez raison! C'était l'erreur. J'avais besoin du chemin de traction, pas seulement du nom de fichier. Cependant, c'était dans le même répertoire. Je ne comprends pas complètement, pourquoi est-ce parce que jusqu'à présent j'ai utilisé seulement la forme ci-dessus, et cela a toujours fonctionné parfaitement. Merci beaucoup! – kampi

+0

Il n'y a aucune garantie que le premier élément argv est un chemin entièrement qualifié vers quoi que ce soit. Puisque nous savons que c'est seulement pour Windows, appelez GetModuleFileName comme Microsoft recommande: http://msdn.microsoft.com/en-us/library/88w63h9k.aspx –

+0

@Rob: Eh bien, quel compilateur sur + Windows + ne retourne pas le chemin complet de l'application dans le premier élément argv (pour référence future). J'ai également supposé que, puisque l'OP n'utilisait pas WritePrivateProfileString ou toute autre fonctionnalité de l'API, il y avait une raison de ne pas recommander GetModuleFileName. –

0

Fournissez-vous un chemin absolu ou un chemin relatif? Votre CWD peut être différent au démarrage. Lorsque vous démarrez votre application directement, le chemin actuel correspond au chemin d'installation de votre application.

0

Toutefois, lors du démarrage à partir de ce menu contextuel, le chemin actuel est autre chose.

Il existe deux façons de résoudre ce problème. D'abord, n'utilisez pas un fichier ini. Au lieu de cela, stocker vos informations dans le registre. De cette façon, vous ne vous souciez pas d'où le programme est lancé.

Alternativement, votre application devra localiser le répertoire où elle a été installée, puis charger le fichier ini à partir de là.

De toute évidence, le premier choix est le chemin le plus facile.

0

Avez-vous vérifié si le chemin du fichier pour l'ini est valide?

+0

@Mac: Oui, j'ai vérifié, et j'ai essayé de lui donner un chemin absolu et réaliste aussi. – kampi

1

Je suppose que vous recherchez le fichier ini dans le mauvais dossier. Je voudrais essayer de changer le nom de fichier ini dans l'application pour le nom qualifié complet du fichier ini. (De "foo.ini" à "c: \\ temp \\ foo.ini")

(Veuillez noter que j'ai doublé les barres obliques inverses parce que sans cela, la barre oblique inverse peut changer la signification de la suivante caractère ou la barre oblique inverse peuvent être ignorés)

+0

@David: J'ai essayé les deux méthodes, "Runas.ini", et "d: \ kampi \ runas.ini" aussi, mais aucune n'a fonctionné. Mais si je démarre cet exe manuellement, alors ça marche bien, et je ne sais pas pourquoi. – kampi

+0

@Kampi: avez-vous essayé "d: \\ kampi \\ runas.ini" ou si vous êtes en C# (je ne sais pas si ça marche en C++) @ "d: \ kampi \ runas.ini" –

+0

@kampi : S'il vous plaît noter ma dernière phrase - où il précise que vous devez doubler les barres obliques inverses. Le nom du fichier doit indiquer "d: \\ kampi \\ runas.ini". Sinon le premier caractère \ peut être ignoré et le second et le r remplacé par un retour chariot (0x0d) (j'ai édité mon post original pour le rendre plus clair.) –

Questions connexes