Unmanaged VC++ -> Managed VC++
21 отговора
702 прегледа
Unmanaged VC++ -> Managed VC++
Някой знае ли как се превръща unmanaged Visual C++ .NET код в managed Visual C++ .NET код?
Re: Unmanaged VC++ -> Managed VC++
Имай милост, не ме шегувай така ... Щях да падна на земята от смях ... Де я таз пръчица ...
Re: Unmanaged VC++ -> Managed VC++
kazhi kakvo tochno te interesuva, belkim uspeia da ti pomogna...
posledno vreme mi se nalozhi dosta da pocheta po vaprosa :)
posledno vreme mi se nalozhi dosta da pocheta po vaprosa :)
Re: Unmanaged VC++ -> Managed VC++
to i za smajh go napisah... ;)
inache serjozno... spomnjam si che po helpowete i debelite knigi ima pojasnenja ka se polzwa unmanaged kod ot sredata na managed... ta mi idwa na ideja da si naprawish njakakwa managed obwiwka i taka...
inache serjozno... spomnjam si che po helpowete i debelite knigi ima pojasnenja ka se polzwa unmanaged kod ot sredata na managed... ta mi idwa na ideja da si naprawish njakakwa managed obwiwka i taka...
Re: Unmanaged VC++ -> Managed VC++
Имам един код, който получава от един мултиметър пикселите на LCD-то му и после ги превърща в истински данни. Дотук добре. Обаче е написан на unmanaged Visual C++ и всичко излиза само на конзола. Аз искам да го използвам в среда на managed Visual C++ .NET, като му добавя форми, за да си направя бутони и да представям данните графично на екрана. Оказа се обаче, че не мога да добавям форми, ако кодът не е managed. Попадна ми този линк с инструкции за превръщане от неменажиран в менажиран код:
[линк]
обаче нещо не се получава. Отивам на Properties->Property Pages->C/C++ обаче не намирам Compile as Managed, за да му задам Assembly Support (/clr). Гледам по-надолу има Advanced->Compile As, обаче и там не ми позволява да му задам Assembly Support (/clr). Имаш ли представа как се прави това нещо?
P.S. Между другото опитвам, както каза asdfxcv, да си направя managed обвивка и да прехвърля там неменажираната част, обаче пука по шевовете, та се къса. Ако може някак консервативно да превърна неменажирания код в менажиран май ще е най-лесно, ако изобщо е възможно, де.
[линк]
обаче нещо не се получава. Отивам на Properties->Property Pages->C/C++ обаче не намирам Compile as Managed, за да му задам Assembly Support (/clr). Гледам по-надолу има Advanced->Compile As, обаче и там не ми позволява да му задам Assembly Support (/clr). Имаш ли представа как се прави това нещо?
P.S. Между другото опитвам, както каза asdfxcv, да си направя managed обвивка и да прехвърля там неменажираната част, обаче пука по шевовете, та се къса. Ако може някак консервативно да превърна неменажирания код в менажиран май ще е най-лесно, ако изобщо е възможно, де.
Re: Unmanaged VC++ -> Managed VC++
А какво ти пречи да събереш неменажираната част в един COM компонент и да я викаш от някъде, където правенето на форми е лесно? VB6, Delphi, C#, VB.NET и т.н. -- варианти много.
А иначе "форми" можеш да правиш и с неменажиран C++. MFC, WTL или чисто Win32 API
.
--
Екстремно програмиране на български.
[линк]
А иначе "форми" можеш да правиш и с неменажиран C++. MFC, WTL или чисто Win32 API
--
Екстремно програмиране на български.
[линк]
Re: Unmanaged VC++ -> Managed VC++
Това би било едно много добро решение. Въпросът е как да направя COM компонент, който да прехвърля данните получени от мултиметъра в средата на, да речем, VB.NET. Нещо пример или линк можеш ли да дадеш?
Re: Unmanaged VC++ -> Managed VC++
хваща се били за вълшебната пръчка и прави всичкия унаманагед код на манагед.
леле как само звучи: унаманагед цоде
леле как само звучи: унаманагед цоде
Re: Unmanaged VC++ -> Managed VC++
Трудно ми е да дам прост линк за монумента на програмистките безумия, наречен COM. Ако не си се занимавал, няма смисъл да си губиш времето сега. Направи си някакъв прост механизъм на предаване на данни между процесите -- я pipes, я sockets, я нещо друго и си свиркай.
COM решението можеше да даде предимство, ако си се занимавал, като начин на по-лесно комуникиране. Ама недей да нагазваш там ако не си готов.
--
Екстремно програмиране на български.
[линк]
COM решението можеше да даде предимство, ако си се занимавал, като начин на по-лесно комуникиране. Ама недей да нагазваш там ако не си готов.
--
Екстремно програмиране на български.
[линк]
Re: Unmanaged VC++ -> Managed VC++
Виж до какво достигнах вследствие на проби и грешки. Следвах инструкциите дадени в следния линк:
[линк]
За разлика от това обаче, което линкът инструктира, кликането върху target project’s Property Pages->General->C/C++ не предлага опция Compile As Managed. Единственият начин да получиш опция Compile As Managed, така че да можеш да избереш Assembly Support (/clr) е когато кликаш върху отделните .cpp файлове.
Оказа се обаче, че даже и това не беше достатъчно, за да се компилират правилно отделните .cpp файлове. Трябва също така да се смени Debug Information Format и Code Generation->Basic Runtime Checks.
След като всичко описано по-горе беше направено върху отделните .cpp файлове, последните се компилираха коректно. Сега пък възникна друг проблем. Оказа се, че ако се затвори проектът и се отвори отново, параметрите на .cpp файловете, които трябваше да бъдат променени, всъщност не са. По някаква причина Visual Studio-то не запазва променените параметри. При последващо отваряне проектът продължава да е unmanaged, въпреки промените, които се направиха при първоначалното му отваряне (фолдерите и файловете не са Read-Only).
Имаш ли някаква представа защо се получава така и как може да се запазят променениете параметри?
[линк]
За разлика от това обаче, което линкът инструктира, кликането върху target project’s Property Pages->General->C/C++ не предлага опция Compile As Managed. Единственият начин да получиш опция Compile As Managed, така че да можеш да избереш Assembly Support (/clr) е когато кликаш върху отделните .cpp файлове.
Оказа се обаче, че даже и това не беше достатъчно, за да се компилират правилно отделните .cpp файлове. Трябва също така да се смени Debug Information Format и Code Generation->Basic Runtime Checks.
След като всичко описано по-горе беше направено върху отделните .cpp файлове, последните се компилираха коректно. Сега пък възникна друг проблем. Оказа се, че ако се затвори проектът и се отвори отново, параметрите на .cpp файловете, които трябваше да бъдат променени, всъщност не са. По някаква причина Visual Studio-то не запазва променените параметри. При последващо отваряне проектът продължава да е unmanaged, въпреки промените, които се направиха при първоначалното му отваряне (фолдерите и файловете не са Read-Only).
Имаш ли някаква представа защо се получава така и как може да се запазят променениете параметри?
Re: Unmanaged VC++ -> Managed VC++
taka... nai-lesnoto, koeto si mislia che mozhesh da napravish e da si napravish edin nov windows forms proekt s wizarda na vs-to. sled kato si go napravish niamash nikakva grizha da si polzvash unamanaged code-a ot managed formite.
pogledni kakvi sa razlikite m/u managed i unmanaged c++ vyv slednia file:
Microsoft Visual Studio .NET 2003\Vc7\managedextensionsspec.doc
na kratko:
- niamash nikvi grizhi v managed class da containvash unmanaged takyv
- niamash mnozhestveno naslediavane v managed extension-ite
- managed (__gc) class ne mozhe da e template-n
- niamash const method-i
- reference type managed obektite samo na heap-a mozhesh da gi syzdavash, value type-ovete mozhe i na stack-a
- ne mozhesh v unmanaged class da containvash managed obekt
- niamash nikakvi grizhi v unmanaged class da dyrzhish "pointer" kym managed takyv.. za celta razgledai GCHandle (v msdn-a) i tui koeto pravi zhivota ti 2 idei po-lesen - template-noto class-che gcroot - smart pointer-che, enkapsulirashto lainata pokrai GCHandle-to
otbelezhi fakta che containvaiki unmanaged code v managed class (bez izrichnoto slagane na #pragma unmanaged) go pravi avtomatichno managed, no ne garbage collected.
napravi si smetka kak tochno nai-lesno shte si portnesh proekta.
ako ne polzvash mnozh. naslediavane ili template-i nai-veroiatno shte mozhesh da minesh otnositelno bezbolezneno.
v protiven sluchai napravi managed wrapper-i na raznite klascheta, koito polzvash.... tam e malko klizma, shtoto nai-veroiatno shte ti se nalozhi da marshalizirash tipovete ot managed->unmanaged i obratno, no ne e niakakva bolka za umirane... taka pechelish unmanaged code-a da si byde chisto unmanaged, a managed - chisto managed...
tretia variant (koito silno preporychvam) e da si prenapishesh unmanaged code-a koito imash. ako ne e obemen proekta ti shte stane mnogo byrzo i lesno i nai-veroiatno po-byrzo i chisto ot mixed mode variantite...
ae i ycnex :)
shte ti triabva ;)
pogledni kakvi sa razlikite m/u managed i unmanaged c++ vyv slednia file:
Microsoft Visual Studio .NET 2003\Vc7\managedextensionsspec.doc
na kratko:
- niamash nikvi grizhi v managed class da containvash unmanaged takyv
- niamash mnozhestveno naslediavane v managed extension-ite
- managed (__gc) class ne mozhe da e template-n
- niamash const method-i
- reference type managed obektite samo na heap-a mozhesh da gi syzdavash, value type-ovete mozhe i na stack-a
- ne mozhesh v unmanaged class da containvash managed obekt
- niamash nikakvi grizhi v unmanaged class da dyrzhish "pointer" kym managed takyv.. za celta razgledai GCHandle (v msdn-a) i tui koeto pravi zhivota ti 2 idei po-lesen - template-noto class-che gcroot - smart pointer-che, enkapsulirashto lainata pokrai GCHandle-to
otbelezhi fakta che containvaiki unmanaged code v managed class (bez izrichnoto slagane na #pragma unmanaged) go pravi avtomatichno managed, no ne garbage collected.
napravi si smetka kak tochno nai-lesno shte si portnesh proekta.
ako ne polzvash mnozh. naslediavane ili template-i nai-veroiatno shte mozhesh da minesh otnositelno bezbolezneno.
v protiven sluchai napravi managed wrapper-i na raznite klascheta, koito polzvash.... tam e malko klizma, shtoto nai-veroiatno shte ti se nalozhi da marshalizirash tipovete ot managed->unmanaged i obratno, no ne e niakakva bolka za umirane... taka pechelish unmanaged code-a da si byde chisto unmanaged, a managed - chisto managed...
tretia variant (koito silno preporychvam) e da si prenapishesh unmanaged code-a koito imash. ako ne e obemen proekta ti shte stane mnogo byrzo i lesno i nai-veroiatno po-byrzo i chisto ot mixed mode variantite...
ae i ycnex :)
shte ti triabva ;)
Re: Unmanaged VC++ -> Managed VC++
Много благодаря за обяснението. Много обстойно и хубаво обяснение. За съжаление проблемът се оказва много по-сложен, отколкото първоначално си представях.
Ако не възразяваш бих те попитал някои неща. Когато започнах да го прехвърлям в менажирана среда, това #include <afxwin.h> от неменажирания код не се възприема от менажирания и туй то. Как мога някак да го избягна?
Ако не възразяваш бих те попитал някои неща. Когато започнах да го прехвърлям в менажирана среда, това #include <afxwin.h> от неменажирания код не се възприема от менажирания и туй то. Как мога някак да го избягна?
Re: Unmanaged VC++ -> Managed VC++
niama iadove :)
s MFCto pod managed extension-ite ima izvestno kolichestvo iadove :)
sys stl-a tozhe.
konkretno za mfc-to - ne e nevyzmozhno da se polzva, no e pak dosta klizmatichno :)) ako go polzvash vyv dll shte triabva proekta na toia dll da ne e chisto managed, ami mixed mode... tva se naglasia ot settingite na proekta. osven tova shte triabva da dobavish niakolko export methodi, koito ti praviat inicializaciata na mfc-to... problema idva ot tam, che biblioteki, koito polzvash, koito imat razni static member-i ostavat neinicializirani, ako proekta e chisto managed tip. vizh v msdn-a ima edna gotina statiika po vaprosa - potyrsi "convert from managed to mixed mode" i stypka po stypka apply-vai kvoto pishe tam.
preporyka - razkarai MFC-to - s winforms shte si napravish UIa mnogo po-byrzo i nai-veroiatno po-kachestveno i za UI-a tochno ne si zasluzhava tia klizmi :) drugoto, koeto e MFC i go polzvash go smeni s direct api calls... include na windows.h minava bezgrizhno :)
s MFCto pod managed extension-ite ima izvestno kolichestvo iadove :)
sys stl-a tozhe.
konkretno za mfc-to - ne e nevyzmozhno da se polzva, no e pak dosta klizmatichno :)) ako go polzvash vyv dll shte triabva proekta na toia dll da ne e chisto managed, ami mixed mode... tva se naglasia ot settingite na proekta. osven tova shte triabva da dobavish niakolko export methodi, koito ti praviat inicializaciata na mfc-to... problema idva ot tam, che biblioteki, koito polzvash, koito imat razni static member-i ostavat neinicializirani, ako proekta e chisto managed tip. vizh v msdn-a ima edna gotina statiika po vaprosa - potyrsi "convert from managed to mixed mode" i stypka po stypka apply-vai kvoto pishe tam.
preporyka - razkarai MFC-to - s winforms shte si napravish UIa mnogo po-byrzo i nai-veroiatno po-kachestveno i za UI-a tochno ne si zasluzhava tia klizmi :) drugoto, koeto e MFC i go polzvash go smeni s direct api calls... include na windows.h minava bezgrizhno :)
Re: Unmanaged VC++ -> Managed VC++
Благодаря. Махнах MFC-тата и нещата се оправиха. Сега обаче, както ме предупреди, нещо template-ния хедер ми създава проблеми. В него уж дефинирам следното
#ifndef FUNCTION_TEMPLATES_H
#define FUNCTION_TEMPLATES_H
//
#include "parameters.h"
//
double Process22812Read(BYTE * bBuf, DWORD dwRead, HANDLE &hComm);
double Translate22812(BYTE * bBuf);
PASS_FAIL ConfigureSerialInterface(HANDLE &hComm);
//
#endif
а във cpp-тата, които го викат ми излиза грешка за BYTE, DWORD и bBuf ‘undeclared identifier’. Имаш ли някаква представа защо?
#ifndef FUNCTION_TEMPLATES_H
#define FUNCTION_TEMPLATES_H
//
#include "parameters.h"
//
double Process22812Read(BYTE * bBuf, DWORD dwRead, HANDLE &hComm);
double Translate22812(BYTE * bBuf);
PASS_FAIL ConfigureSerialInterface(HANDLE &hComm);
//
#endif
а във cpp-тата, които го викат ми излиза грешка за BYTE, DWORD и bBuf ‘undeclared identifier’. Имаш ли някаква представа защо?
Re: Unmanaged VC++ -> Managed VC++
vizh v koi header se definirat DWORD, BYTE i HANDLE i si go include-ni
principno niama problemi s polzvaneto na windowskite tipove pod managed c++
principno niama problemi s polzvaneto na windowskite tipove pod managed c++
Re: Unmanaged VC++ -> Managed VC++
Пробвам с
#include "WINDEF.H"
#include "WINNT.H"
където би трябвало да се дефинират, но виж какво ми връща:
error C2146: syntax error : missing ';' before identifier 'ContextRecord'
error C2501: '_EXCEPTION_POINTERS::PCONTEXT' : missing storage-class or type specifiers
error C2501: '_EXCEPTION_POINTERS::ContextRecord' : missing storage-class or type specifiers
във WinNT.h.
#include "WINDEF.H"
#include "WINNT.H"
където би трябвало да се дефинират, но виж какво ми връща:
error C2146: syntax error : missing ';' before identifier 'ContextRecord'
error C2501: '_EXCEPTION_POINTERS::PCONTEXT' : missing storage-class or type specifiers
error C2501: '_EXCEPTION_POINTERS::ContextRecord' : missing storage-class or type specifiers
във WinNT.h.
Re: Unmanaged VC++ -> Managed VC++
#include "windows.h"
vizh tva dali niama da svyrshi rabota...
pri men s toia include vsichko si pee i sviri :)
vizh tva dali niama da svyrshi rabota...
pri men s toia include vsichko si pee i sviri :)
Re: Unmanaged VC++ -> Managed VC++
Това #include "windows.h" свърши работа, но покрай него трябваше да махна четири .cpp файла, както и да прибавя неща от сорта на #undef MessageBox. Сега изглежда, че всичко върви добре, проектът се компилира добре, но възникна един принципен проблем -- данните се получават в един от .cpp файловете, а не мен ми трябват във Form1.h. Знаеш ли как се прехвърлят променливи, масиви и т.н. от ,cpp в .h файлове. Опитвам със static double meter; (данните са в meter), но няма как да направя #include на .cpp във Form1.h.
Re: Unmanaged VC++ -> Managed VC++
tuka pich nikoi ne mozhe da ti pomogne ;)
mirishe na design issues, koito sam triaa da si resolve-nesh...
tva che ne si si design-nal dobre proekta e otdelen vapros
a inache ako ot unmanaged shte podavash danni kym managed shte triaa da marshall-nesh vsichko neobhodimo, s koeto shte si zahranvash formata...
mirishe na design issues, koito sam triaa da si resolve-nesh...
tva che ne si si design-nal dobre proekta e otdelen vapros
a inache ako ot unmanaged shte podavash danni kym managed shte triaa da marshall-nesh vsichko neobhodimo, s koeto shte si zahranvash formata...