我制作了一个应用程序和一个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
答案 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的文件路径是否有效?