启动程序失败,错误代码为1

时间:2009-12-29 20:46:21

标签: c++ windows

我制作了一个应用程序和一个dll,它们正在以这种方式工作: 我必须注册dll。如果我右键单击.exe文件注册了dll后,会出现弹出菜单,我已经在此菜单中插入了一行(“启动MyApp”),如果我点击那里,它应该启动MyApp。 MyApp有一个参数,它是所选.exe文件的完整路径。使用此路径启动MyApp后,应使用CreateProcessWithLogonW()创建一个进程。此应用程序从.ini文件中读取用户名,密码和域。我的问题是,在MyApp启动后,它总是失败,因为它无法找到ini文件。错误代码是:1(功能不正确)。 如果我手动启动MyApp,它可以正常工作。

有没有人知道为什么会这样,我怎么能解决这个问题?

提前致谢!

kampi

UPDATE1:

以下是从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  

5 个答案:

答案 0 :(得分:3)

正如其他人所说,你的问题就在这里:

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

两个函数调用都没有提供路径。您期望当前的工作目录是您的应用程序所在的文件夹,但它不一定是(事实上,您永远不应该假设它是)。上下文菜单没有先设置工作目录。

您最安全的选择是使用argv []中提供的路径检索文件夹的路径(第0个元素是应用程序本身的完全限定路径和名称,您可以从中提取路径)。然后,您将准确了解文件的位置,并可以将ini文件的名称附加到该路径。

答案 1 :(得分:1)

我怀疑你正在寻找错误文件夹中的ini文件。我会尝试将应用程序中的ini文件名更改为ini文件的完全限定名称。 (即从“foo.ini”到“c:\\ temp \\ foo.ini”)

(请注意,我将反斜杠加倍,因为如果没有这个,单个反斜杠可能会改变下一个字符的含义,或者反斜杠可能会被忽略。)

答案 2 :(得分:0)

您提供绝对路径还是相对路径?您的CWD在启动时可能会有所不同。

答案 3 :(得分:0)

直接启动应用程序时,当前路径是应用程序安装到的路径。

但是,从该上下文菜单启动时,当前路径是其他内容。

有两种方法可以解决这个问题。首先,不要使用ini文件。而是将您的信息存储到注册表。这样你就不关心程序的起始位置。

或者,您的应用必须找到实际安装它的目录,然后从那里加载ini文件。

显然,第一选择是最简单的方法。

答案 4 :(得分:0)

您是否检查过ini的文件路径是否有效?