Wersja unixowa:
KOD cpp: UKRYJ
char *get_self_executable_directory()
{
int rval;
char link_target[1024];
char *last_slash;
size_t result_length;
char *result;
rval=readlink("/proc/self/exe",link_target,sizeof(link_target)-1);
if(rval==-1)
abort();
else
link_target[rva]='\0';
last_slash=strrchr(link_target,'/');
if(last_slash==NULL || last_slash==link_target)
abort();
result_length=last_slash-link_target;
result=(char*)xmalloc(result_length+1);
strncpy(result,link_target,result_length);
result[result_length]='\0';
return result;
}
{
int rval;
char link_target[1024];
char *last_slash;
size_t result_length;
char *result;
rval=readlink("/proc/self/exe",link_target,sizeof(link_target)-1);
if(rval==-1)
abort();
else
link_target[rva]='\0';
last_slash=strrchr(link_target,'/');
if(last_slash==NULL || last_slash==link_target)
abort();
result_length=last_slash-link_target;
result=(char*)xmalloc(result_length+1);
strncpy(result,link_target,result_length);
result[result_length]='\0';
return result;
}
W przeciwieństwie do tego kodu, musiałem zamienić typ char na wchar_t, oraz znalezc jakiś zamiennik dla funkcji readlink, która znajduje się bodajże w bibliotece #include <unistd.h>, a tej po prostu Builder nie ma. Zamiast powyższej funkcji użyłem windowsowej GetModuleFileName, czego do końca nie jestem pewien jeśli chodzi o zasadność tego zamiennika. Tak google podpowiadał przynajmniej. Kod skrócony, bez zabezpieczeń typu sprawdzanie NULL i abort().
KOD cpp: UKRYJ
wchar_t* __fastcall TForm1::ln_Directory(String dir1)
{
size_t width;
int value_Start;
wchar_t *end_Char,*ln_Result;
wchar_t link[1024];
value_Start=GetModuleFileName(NULL,dir1.w_str(),1024);
link[value_Start]='\0';
end_Char=wcsrchr(link,'/');
width=end_Char-link;
ln_Result=(wchar_t*)malloc(width+1);
wcsncpy(ln_Result,link,width);
ln_Result[width]='\0';
return ln_Result;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text=ln_Directory("C:/Users");
}
{
size_t width;
int value_Start;
wchar_t *end_Char,*ln_Result;
wchar_t link[1024];
value_Start=GetModuleFileName(NULL,dir1.w_str(),1024);
link[value_Start]='\0';
end_Char=wcsrchr(link,'/');
width=end_Char-link;
ln_Result=(wchar_t*)malloc(width+1);
wcsncpy(ln_Result,link,width);
ln_Result[width]='\0';
return ln_Result;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text=ln_Directory("C:/Users");
}
Kompiluej się ok. Przy uruchomieniu error typu: Access violation at address .... in module CC32240.dll