Fordítási hiba, atlbase.h VC6 => VS2005

Fordítási hiba, atlbase.h VC6 => VS2005
2008-08-19T14:33:32+02:00
2008-08-25T09:25:25+02:00
2022-11-10T18:30:38+01:00
ZsZs
Sziasztok!

Szeretném a korábbi VC6-os projectemet áttenni 2005 alá.
Az inkompatibilitások zömét talán már megoldottam, de belefutottam egy makacsabb fordítóüzenetbe:


c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlbase.h(4555) : error C3861: '_beginthreadex': identifier not found


A neten kétféle megoldást is javasoltak ilyesmi problémára:
1. hozzáadni a "process.h"-t. Beleírtam direktbe az atlbase.h file elejére, de úgy sem fordult le.
2. /MT kapcsolóval fordítani - ez sem jött össze.

Hogy lehetne a fordítót rávenni, hogy lefordítsa?

Köszi,
ZsZs.
Mutasd a teljes hozzászólást!
Beleírtam direktbe az atlbase.h file elejére

Az felejtsd el. Amik a VS-el jöttek, hagyd csak békén, mert úgy van jól, hidd el nekem. Nem hiszem, hogy te ( vagy bárki más ) jobbat tudsz, mint azok akik megírták a VS-t.

Azt hiszem az
#include <windows.h>
lesz a megoldás erre a hibára.
Mutasd a teljes hozzászólást!

  • Egy forráskód részlet sokat segítene, hogy hol száll el, és hogy mi is ez a '_beginthreadex'.
    Mutasd a teljes hozzászólást!
  • Szia!

    A fordító saját, atlbase.h állományában:

    ///////////////////////////////////////////////////////////////////////////// // Thread creation helpers #if !defined(_ATL_MIN_CRT) && defined(_MT) // CRTThreadTraits // This class is for use with CThreadPool or CWorkerThread // It should be used if the worker class will use CRT // functions. class CRTThreadTraits { public: static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw() { ATLASSERT(sizeof(DWORD) == sizeof(unsigned int)); // sanity check for pdwThreadId // _beginthreadex calls CreateThread which will set the last error value before it returns. [b]return (HANDLE) _beginthreadex(lpsa, dwStackSize, (unsigned int (__stdcall *)(void *)) pfnThreadProc, pvParam, dwCreationFlags, (unsigned int *) pdwThreadId);[/b] } };

    Az atlbase.h pedig megtalálható: "C:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\include\atlbase.h"

    Ma arra jöttem rá, ha egy üres MFC alkalmazást csinálok és beinkludolom az atlbase-t, akkor lefordul.

    Ellenben a saját projectemben nem.
    Pedig nem is direktben nyitottam meg a VC6-os projectet, hanem létrehoztam egy külön VC8 projectet, abba betettem a VC6 resoutc-ét. Eddig ok, build működik. Utána kézel hozzáadogattam a forrásállományokat, volt pár inkompatibilitás és warning amiket megoldottam, s végül maradt ez...
    Mutasd a teljes hozzászólást!
  • Beleírtam direktbe az atlbase.h file elejére

    Az felejtsd el. Amik a VS-el jöttek, hagyd csak békén, mert úgy van jól, hidd el nekem. Nem hiszem, hogy te ( vagy bárki más ) jobbat tudsz, mint azok akik megírták a VS-t.

    Azt hiszem az
    #include <windows.h>
    lesz a megoldás erre a hibára.
    Mutasd a teljes hozzászólást!
  • Ezt az egyszerű kis példát le tudod fordítani?


    // crt_begthrdex.cpp // compile with: /MT #include <windows.h> #include <stdio.h> #include <process.h> unsigned Counter; unsigned __stdcall SecondThreadFunc( void* pArguments ) { printf( "In second thread...\n" ); while ( Counter < 1000000 ) Counter++; _endthreadex( 0 ); return 0; } int main() { HANDLE hThread; unsigned threadID; printf( "Creating second thread...\n" ); // Create the second thread. hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID ); // Wait until second thread terminates. If you comment out the line // below, Counter will not be correct because the thread has not // terminated, and Counter most likely has not been incremented to // 1000000 yet. WaitForSingleObject( hThread, INFINITE ); printf( "Counter should be 1000000; it is-> %d\n", Counter ); // Destroy the thread object. CloseHandle( hThread ); }
    Mutasd a teljes hozzászólást!
  • Köszi, most itthon vagyok, de holnap reggel ez lesz az első amit kipróbálok...

    De a VC6 eddig nemnagyon díjazta, ha MFC-s projectben szereplő forrásba a windows.h-t beszúrtam, ez már változtott? (valami olyasmi rémlik, hogy az volt a hibaüzenet ilyenkor, hogy ezt már az afx valamelyik header-e megtette...)

    Más, nekem az az atlbase.h azért kell, mert COM-ot használok (azon keresztül kapcsolódok a CAD rendszerhez). Nem fejlesztettek ki azóta valami más headert, s már azt ajánlják helyette használni? (Még ez jutott az eszembe...)

    Köszi,
    ZsZs.

    Ui. amúgy azért írtam be direktbe az atlbase.h-ba mert a msdn-en azt írták, hogy a process.h kell a _beginthreadex() használatához, s ennek a headernek az inculde-ja egy feltételes fordítási blokkban van. Így viszont tuti, hogy megvan... Azóta mivel nem ez volt a bűnös, helyreállítottam az eredeti állapotot...
    Mutasd a teljes hozzászólást!
  • Ezt is csak holnap tudnám megmondani, de ha egy üres dialógust tartalmazó MFC applikációt csinálok, a diológus cpp-jének a elejére beteszem az atlbase.h inculde-ját, akkor rendesen megy.
    A project property-jében az include path bővítettem, a General/Character Set beállítást át kellett állítanom Multibyte-ra, és hozzáadtam pár warning letiltását. És ez az üres project működik a /MDd kapcsolóval, nem kell neki a /MT.
    Mutasd a teljes hozzászólást!
  • és hozzáadtam pár warning letiltását

    Ezt ne csináld. Hagyd úgy, a "gyári" beállításon. Nem hiába warning, azokat mindig ki kell javítani a kódban.
    Mutasd a teljes hozzászólást!
  • Szia,

    igazad van, csak amikor előszöre kaptam a 100-as hibalistákat, a warningokat megnéztem, hogy mik majd, letiltottam. A végén majd újra előveszem a warning listát is.

    Viszont az atlbase.h-s hiba ügyében fejlemény van:

    Újra kezdtem a VC8-as project összerakását, a forrásállományokat csoportokban, illetve amikor kiderült melyik csoportban van a hiba, darabonként adogattam a projecthez.

    A projectek közösen használt osztályai egy külön könyvtárban vannak, s amikor ezt hozáadtam az include listához akkor - számomra meglepő módon - nemcsak a konkrét project által hivatkozott állományokat fordítja le, hanem a teljes könyvtárban turkál, a nem használ file-ok közöt is.
    Tuti, hogy sem a projecthez hozzá nem adott állomány és egy file-ban sem hivatkozott állományról van szó.

    Így aztán a könytár hozzáadása, még egy üres propject esetén is adja a hibaüzenetet.
    Már megvan, hogy melyik osztály kavar be, de még keresem, hogy azon belül mi...
    Mutasd a teljes hozzászólást!
  • csak amikor előszöre kaptam a 100-as hibalistákat

    Gyakran előfordul, hogy ua. a hiba ismétlődik a listában, persze nem ugyanarra a kódrészletre. Az is elképzelhető, hogy 100 hibát ad a fordító, de ha ott ahol kell kijavítod az ( egyetlen létező ) hibát, akkor utána lefordul gond nélkül.

    nemcsak a konkrét project által hivatkozott állományokat fordítja le, hanem a teljes könyvtárban turkál, a nem használ file-ok közöt is.
    Tuti, hogy sem a projecthez hozzá nem adott állomány és egy file-ban sem hivatkozott állományról van szó.

    Azért ezt nem tudom elhinni...
    Mutasd a teljes hozzászólást!
  • Tudom hihetetlen, de mégis így van!

    Megpróbálom pontosan leírni a jelenséget.

    Van egy Solution, tartozik hozzá egy A és egy B project, illetve egy Classes könyvtár, ami szerepel mindkét project 'Additional Include Directory'-ában.
    Ezenkívül van egy osztály, nevezzük P-nek ami áll egy h és egy cpp állományból.

    Az A projectnek semmi szüksége a P osztályra.
    Kezdetben a Calasses könyvtár nem tartalmazza a P osztály állományait.
    A Build sikeres.

    Áttérek a B projectre beteszem a Classes könyvtárba a szükséges további osztályokat, köztük a P osztályt is.
    A fordítás megpusztul a nevezetes atlbase-es hibával.

    Visszamegyek a A projecthez, rebuild, és ugyanezzel a fordítási hibával ő is megpusztul.

    Kihajítom a Classes könyvtárból a P osztály állományait, rebuld az A projectre - minden tökéletes.

    Már órák óta szórakozom vele, oda-vissza, a közös include directory valahogy összekapcsolja a két független projectet.

    A P osztály amúgy semmi extrát nem tartalmaz, hogy a Classes könyvtár osztályai közül miért pont ez az egy nem tudom.
    Nem magával a P osztállyal van baja, hanem az osztály elején levő include résszel.

    Van egy GlobHead.h állományom amit minden más használ, annak az elején volt a windows.h és az atlbase.h include.
    Valami olyasmi lehetett a baja, hogy az atlbase többszörösen szúródott be egy forditás során? Pedig használom a #pragma once és a #ifndef-#define-#endif szerkezetet is.

    Viszont ahogy a windows.h-t és az atlbase.h-t a GlobHead.h-ból átettem az stdafx.h végére, minden helyreállt, és megszűnt az atlbase-es fordíthiba.

    A B projectet még nem buildeltem le, de remélem már menni fog.
    Mutasd a teljes hozzászólást!
  • Megvan a build is!

    Viszont az előző megoldás nem volt jó!
    egyszerüen törölni kellett mindenhonnan a windows.h és a atlbase.h hivatkozásokat.
    (Ugyanis a stdafx.h-ban levő afxwin.h - vagy az őt kisérő headerek - tartalmazhatják.)
    MFC app projectben, ha együtt van az stdafx, és valahol még (ezekszerint feleslegesen) megadva a windows.h és a atlbase.h include-ja, akkor ha a csillagok állása is olyan, előjön a hiba...

    Aztán kellett még "pár kört futnom", ugyanis az A project Win32 console applikáció stdafx-el, a B project pedig MFC applikáció (exe).
    Így aztán ami jó volt a B-nek, nem lett jó az A-nak.

    Végül az A project stdafx-ébe beszúrtam a szükséges definicókat és include-okat, végül mostmár az is megy.

    A megoldás az lehet, hogy MFC app projectnál nem szabad a windows.h-t és az atlbase.h-t használni, és nincs is rá szükség.
    Win32 consolle app projectnél hiába tett be a VC8 egy stdafx.h-t szükség van a windows.h és a atlbase.h állományok include-ára, viszont, ha a kétféle project közös állományokon osztozik, akkor a console-os alkalmazás stdafx.h-ját ki kell bővíteni.

    Ez lett a Win32 console app stdafx.h-ja:
    // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #pragma once #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <stdio.h> #include <tchar.h> #define _AFXDLL #ifndef WINVER // Allow use of features specific to Windows XP or later. #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. #define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif #ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. #define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. #endif #ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later. #define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE. #endif #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes // TODO: reference additional headers your program requires here

    Mutasd a teljes hozzászólást!
  • Nem értem minek neked több project egy solutionba? Egy nem elég arra amit csinálni akarsz?
    Ha egymástól függenek, akkor az egyik project legyen az exe-t létrehozó project, a másik ( vagy a többi ) pedig legyen egy lib ami(ke)t majd hozzálinkelsz az exe-hez.
    Mutasd a teljes hozzászólást!
  • Igazából (jelenleg) 8 project van és 8 féle dolgot csinálnak.
    Ezekenek a projecteknek mindnek önállóan indíthatónak kell lenniük, lib-nek dll-nek nem jó. Ha a projectek közös könyvtárából csinálok is dll-t, akkor is kell mindhez egy-egy külön exe...
    Én is gondolkoztam már a dll-es megoldáson, de a legjobb esetben is 3 exe és 5 dll lenne, de a projectek száma nem csökkenne.

    Nagyon köszönöm a segítségedet!
    Üdv.:
    ZsZs.
    Mutasd a teljes hozzászólást!
  • Ugyan a megoldás az amit fentebb írtam, de nem akarom magamat megoldónak jelölni és szeretném sanyának adni a pontokat.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd