generowanie biblioteki dll, bledy kompilacji

0

Witam, Mam do wygenerowania biblioteke ktoral istuje pliki z katlaogu i jego podkatlaogow program juz dziala normalnie ale jak chce to ujac w biblioteke to przy kompilaci wyrzuca ponizej wymienione bledy ktorych nie umiej zidentyfikowac.

struct folder {
       char sciezka[MAX_PATH+1];
       char nazwa[MAX_PATH+1];
       LARGE_INTEGER rozmiar[MAX_PATH+1]; 
};

typedef TCHAR* TCHARptr; // definicja typu char ................

folder * __declspec(dllexport) _stdcall listowanie(const char * sciezkastart)
{
    /// @todo wstawić wszędzie typ char, albo TCHAR - nie mieszać ich
    /* ... */    
    TCHAR glownyfolder[MAX_PATH+1];
    /* ... */
    /// @notice to w kompilacji Unicode'owej się posypie
    strncpy(glownyfolder,sciezkastart,MAX_PATH);
    /* ... */
}

Błędy:

Error 1 error C2143: syntax error : missing '{' before '*' e:\listowanie_generator\funcja.c 24
Error 2 error C2059: syntax error : 'type' e:\listowanie_generator\funcja.c 24

Srodowisko: Visual Studio 2005 Pro Edition
OS: Windows Vista Premium 32-bit

Mam watpliwosci co do tej lini:

folder * __declspec(dllexport) _stdcall listowanie(const char * sciezkastart)

w instukcji do generowania biblioteki mam przyklad ze funkcja w bibliotece wyglada tak:

unsigned int __declspec(dllexport) _stdcall 
                PodajRozmiarObszaruNiezajetego(char symbol_dysku)

Z gory dzieki za pomoc.

0

Ok, po kolei:

1)wyczyściłem ci kod z postów, żeby było widać problem, a żeby "mądrzy" nie czepiali się pierdół, pytanie zostawiając bez odpowiedzi

  1. masz dwa wyjścia: przetasuj trochę deklarację:
__declspec(dllexport) folder* _stdcall  listowanie(const char * sciezkastart)

albo typedef'a zrób (i w końcu wiadomo, dlaczego Microsoft tak lubi typedef'y wskaźnikowe (LPCSTR, LPBYTE itd itp):

typedef folder* folder_ptr;
folder_ptr __declspec(dllexport) _stdcall listowanie(const char * sciezkastart)

PS.
usunąłem trochę za dużo w szale ;p Tzn na początku miałeś jednocześne dołączane stdlib.h i cstdlib a błędy wywalało gdzieś w pliku cstdlib. To było oszukajstwo - ból przeniesiony. Jednoczesne include'owanie stdlib.h i cstdlib nie powinno powodować błędów, chyba, że nagłówki pisał idiota (a nagłówków stdliba do VC++ nie pisali idioci). Jak chcesz, możesz wsadzić oba, i zobaczysz, że po poprawieniu deklaracji eksportowych wszystko idzie. Co prawda to oczywiste, ale na Visual Studio 9 sprawdziłem dla pewności...

0

dzieki za odpowiedz,

dalej nie moge dojsc co jst nie tak idac tak jak piszesz zmienilem deklaracje eksportu, przy tej:

__declspec(dllexport) folder* _stdcall  listowanie(const char * sciezkastart)

wywala mnÓstwo bledow, oto kawalek:

Error 1 error C2143: syntax error : missing '{' before '*' e:\listowanie_generator\funcja.c 22
Error 2 error C2143: syntax error : missing ';' before ':' e:\listowanie_generator\funcja.c 41
Error 3 error C2065: 'folder' : undeclared identifier e:\listowanie_generator\funcja.c 43
Error 4 error C2065: 'allFilesFound' : undeclared identifier e:\listowanie_generator\funcja.c 43
Error 6 error C2275: 'TCHAR' : illegal use of this type as an expression e:\listowanie_generator\funcja.c 45
Error 7 error C2146: syntax error : missing ';' before identifier 'filename' e:\listowanie_generator\funcja.c 45
Error 8 error C2065: 'filename' : undeclared identifier e:\listowanie_generator\funcja.c 45
Error 9 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 45
Error 10 error C2275: 'TCHAR' : illegal use of this type as an expression e:\listowanie_generator\funcja.c 46
Error 11 error C2146: syntax error : missing ';' before identifier 'sciezka' e:\listowanie_generator\funcja.c 46
Error 12 error C2065: 'sciezka' : undeclared identifier e:\listowanie_generator\funcja.c 46
Error 13 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 46
Error 14 error C2275: 'TCHAR' : illegal use of this type as an expression e:\listowanie_generator\funcja.c 47
Error 15 error C2146: syntax error : missing ';' before identifier 'filefound' e:\listowanie_generator\funcja.c 47
Error 16 error C2065: 'filefound' : undeclared identifier e:\listowanie_generator\funcja.c 47
Error 17 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 47
Error 18 error C2275: 'TCHAR' : illegal use of this type as an expression e:\listowanie_generator\funcja.c 48
Error 19 error C2146: syntax error : missing ';' before identifier 'filenamefound' e:\listowanie_generator\funcja.c 48
Error 20 error C2065: 'filenamefound' : undeclared identifier e:\listowanie_generator\funcja.c 48
Error 21 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 48
Error 22 error C2275: 'LARGE_INTEGER' : illegal use of this type as an expression e:\listowanie_generator\funcja.c 49
Error 23 error C2146: syntax error : missing ';' before identifier 'filesizefound' e:\listowanie_generator\funcja.c 49
Error 24 error C2065: 'filesizefound' : undeclared identifier e:\listowanie_generator\funcja.c 49
Error 25 error C2275: 'TCHAR' : illegal use of this type as an expression e:\listowanie_generator\funcja.c 50
Error 26 error C2065: 's' : undeclared identifier e:\listowanie_generator\funcja.c 50
Error 27 error C2065: 'folderArray' : undeclared identifier e:\listowanie_generator\funcja.c 57
Error 28 error C2065: 'new' : undeclared identifier e:\listowanie_generator\funcja.c 57
Error 29 error C2106: '=' : left operand must be l-value e:\listowanie_generator\funcja.c 57
Error 30 error C2146: syntax error : missing ';' before identifier 'folder' e:\listowanie_generator\funcja.c 57
Error 31 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 57
Error 32 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 58
Error 35 error C2198: 'strncpy' : too few arguments for call e:\listowanie_generator\funcja.c 58
Error 36 error C2146: syntax error : missing ';' before identifier 'folder' e:\listowanie_generator\funcja.c 61
Error 37 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 61
Error 38 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 65
Error 41 error C2198: 'strncpy' : too few arguments for call e:\listowanie_generator\funcja.c 65
Error 42 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 66
Error 45 error C2198: 'strncpy' : too few arguments for call e:\listowanie_generator\funcja.c 66
Error 46 error C2109: subscript requires array or pointer type e:\listowanie_generator\funcja.c 81
Error 49 error C2198: 'strncpy' : too few arguments for call e:\listowanie_generator\funcja.c 81

po podstawieniu deklaracji z definicja typu:

typedef folder* folder_ptr;
folder_ptr __declspec(dllexport) _stdcall listowanie(const char * sciezkastart)
{

daje 5 bledow:
(bledy w liniach 22,23,24 odpowiadaja kolejno tym trzem linia wyzej)

Error 1 error C2143: syntax error : missing '{' before '*' e:\listowanie_generator\funcja.c 22
Error 2 error C2040: 'folder_ptr' : 'int' differs in levels of indirection from 'int *' e:\listowanie_generator\funcja.c 23
Error 3 error C2054: expected '(' to follow 'folder_ptr' e:\listowanie_generator\funcja.c 23
Error 4 error C2085: 'listowanie' : not in formal parameter list e:\listowanie_generator\funcja.c 24
Error 5 error C2143: syntax error : missing ';' before '{' e:\listowanie_generator\funcja.c 24

przyznam ze nie zbardzo rozumiem nature tych bledow w szczegolnosci ostatniego

piszesz ze chodzi Ci w vs 9, myslisz ze warto sprobowac to skompilowac pod 9? (tak czy tak bede to musial na wersji 9 przedstawic)

co do unicode to zalecono nam ustawienie characters set = none, czy to ma rozwiazac problem o ktorym piszesz?

0

No więc: na Visualu 9 chodzi to twoje (dosłowny copy-past) po wprowadzeniu tej jednej poprawki. Więc jeśli nie wpadnę do rana z czytania na sucho posta, to radziłbym przejście na VC9.

A jeśli chodzi o characters set - tak jest, z ustawieniem none wszystko chodzi. Tylko - to już tak opcjonalnie - po co używać uniwersalnych znaków TCHAR, jeśli się przesiadki na unicode nie planuje? Ok... może ktoś coś takiego ci kazał, sygnalizuję, że to jest bez sensu (czyli że nie daje to nic a nie, że źle!).

Dobra, chyba mam:

przede wszystkim kod w całości dla ciekawych (tylko proszę, nie wsadzajcie pseudo-inteligentnych odpowiedzi, że gdzieś w stringu \ jest połknięte, albo nagłówki nadmiarowe, albo styl kodu zły... - widać, ze to faza development przecież.

Ty masz gdzieś deklarację tej funkcji w postaci:
int __declspec(dllexport) _stdcall listowanie(const char * sciezkastart)

przejrzyj pliki nagłówkowe projektu. i deklarację struktury (struct) przenieś do nagłówka, i w obu miejsach daj tę samą deklarację funkcji: żeby zwracała folder_ptr

0

zadzialalo pod vs9 :)

dzieki za pomoc

jeszcze tak dodatkowo mam pytanie jak mozna najprosciej pobrac ilosc rekordow w strukturze? mam ta strukture ktora zwraca funkcja i teraz jak ja wyswietlam to potrzebuje ilosc jej rekordow, probowalem sprawdzic wykonywanie petli az element struktury bedzie pusty ale cos bylo nie tak, jeszcze nad tym posiedze, jescze raz dzieki za pomoc, pozdrawiam.

0

spróbuj na końcu funkcji przed return oznaczyć sobie ostatni element, czyli coś, ala:

allFilesFound[ilePlikowZnalezionoZnacznik].sciezka[0] = 0;
allFilesFound[ilePlikowZnalezionoZnacznik].nazwa[0] = 0;

później ilość będziesz miał z czegoś takiego:

folder* table = listowanie("....");
int length = 0;
while( *(table[length].sciezka) ) length++;

btw:
czy pole rozmiar musi być tablicą zawierającą 1000 liczb?!
i czy na pewno musisz rezerwować na starcie 32 tysiące rekordów folder?!

To kapkę dużo pamięci zajmuje... tak na oko to ma 32768*6KB = 192 MB :|

może twórz to na vectorze za pomocą push_back, a dopiero na końcu zamień na tablicę o rozmiarze wektor.size()+1; i do niej przepisz wynik (nie zapominając o oznaczeniu ostatniego wpisu).</b>

0

sorry ze tka pozno ale sesja w toku :)

listowanie stuktury zrobilem jak napisales, rozmair zrobilem jako int, tutaj dodalem kod ktory bede oddawal http://pastebin.4programmers.net/44

dzieki za pomoc
pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1