CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Dowiązanie symboliczne Windows

Dowiązanie symboliczne Windows

dział ogólny

Dowiązanie symboliczne Windows

Nowy postprzez lukagrom » poniedziałek, 9 grudnia 2019, 11:40

W jednej z książek o programowaniu w Linuksie znalazłem opis funkcji, która wypisuje dowiązania symboliczne na podstawie wskazanej ścieżki. Treść naturalnie w C. Postanowiłem przekształcić ją na C++ Builder, przy czym o ile program się kąpiluje to już z uruchamianiem jest problem.
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;
}

 

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");
}
 

Kompiluej się ok. Przy uruchomieniu error typu: Access violation at address .... in module CC32240.dll
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 123
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Dowiązanie symboliczne Windows

Nowy postprzez polymorphism » poniedziałek, 9 grudnia 2019, 20:44

Czytałeś, jak działa funkcja GetModuleFileName? W drugim parametrze powinieneś podać adres bufora, gdzie ma być wpisana ścieżka, a ty podałeś adres do zawartości dir1, która nie wiadomo, jaki ma rozmiar. Jeśli już, to tak:
KOD cpp:     UKRYJ  
wchar_t exeFilePath[MAX_PATH];
if (GetModuleFileName(NULL, exeFilePath, MAX_PATH)) { ... }
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: Dowiązanie symboliczne Windows

Nowy postprzez lukagrom » poniedziałek, 9 grudnia 2019, 20:57

Rzeczywiście. Nie doczytałem. Zły wybór funkcji i nieprawidłowe dobranie argumentów do niej.
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 123
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Dowiązanie symboliczne Windows

Nowy postprzez polymorphism » poniedziałek, 9 grudnia 2019, 21:10

Nie wiem też, jaki to ma związek z dowiązaniem symbolicznym.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: Dowiązanie symboliczne Windows

Nowy postprzez lukagrom » poniedziałek, 9 grudnia 2019, 22:11

Kopiowanie w ciemno linuksowych przykładów i kosmetyczne zmienianie to nie jest najlepszy pomysł. Żeby było w zgodzie z tematem, użycie polecenia mklink
KOD cpp:     UKRYJ  
void __fastcall TForm1::mklink_d_Run(AnsiString base, AnsiString dest)
{
 AnsiString def_Mklink="mkling /D";
 AnsiString result_Mklink=def_Mklink+" "+base+" "+dest;
 system(result_Mklink.c_str());
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString name="C:\Users";
    AnsiString dest="C:\Users\luk\Dokumenty";
    mklink_d_Run(name,dest);
}
 
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 123
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Dowiązanie symboliczne Windows

Nowy postprzez polymorphism » poniedziałek, 9 grudnia 2019, 22:36

Ciekawe, że w Windowsie dowiązania symboliczne są "ukryte". Żeby móc je robić z poziomu eksploratora, trzeba zainstalować odpowiednie rozszerzenie. Sam system też jakoś nieszczególnie ich używa (w porównaniu do Linuksa).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron