Konwersja aplikacji z CLI na okienkową - błędy LNK

0

Witam,

Na wstępie wyjaśnię, że specjalistą C++ nie jestem :-) więc za trudnych pytań proszę nie zadawać :)

Potrzebuję zrobić wydawałoby się bardzo prostą rzecz... mianowicie, skleciłem na podstawie dostępnych materiałów działającą, bardzo prostą aplikację CLI w VC++ i chciałbym ją przerobić na wersję okienkową, aby można było myszką łatwo wskazać rzeczy, które w tej chwili podaję jako argument w CLI. Trochę materiałów w sieci na temat konwersji jest, więc postępuję zgodnie z tymi tutorialami, ale wymiękłem, kiedy kompilator zwraca mi błędy typu:

error "LNK2028: unresolved token (0A00008A) "extern "C" wchar_t * __stdcall SysAllocString(wchar_t const *)" (?SysAllocString@@$$J14YGPA_WPB_W@Z) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)"

Jak zaobserwowałem, problemem są zmienne typu wchar, bo kiedy je wywalę, to wersja okienkowa się kompiluje.
Czy ktoś z Was może w łopatologiczny sposób mi wyjaśnić dlaczego, zmienne typu wchar w wersji CLI aplikacji nie są problemem, a w wersji okienkowej są ?? przecież zmienna to zmienna ??? tak mi się przynajmniej wydawało :)

będę wdzięczny za wyjaśnienie.

Pozdrawiam

Michał

1

Hmm, wydaje mi się, że Micorsoft trochę Cię oszukał i nie wiesz, że CLI w Twojej konfiguracji to nie jest Command Line Interface, a Common Language Infrastracture. Twoja nowa, okienkowa, konfiguracja nie posiada zlinkowanych dodatków, które M$ stworzył na potrzeby CLI.

Twój wchar pochodzi właśnie z tych dodatków, których nie linkujesz. Naprawić to możesz, poprzez użycie standardowych typów.

1

wchar_t jest standardowym typem.

Pytanie do pytającego: co wydaje ci się że znaczy CLI, a co to jest „aplikacja okienkowa”? Bo rzeczywiście chyba mylisz pojęcia i próbujesz zrobić coś dziwnego.

0
Azarien napisał(a):

Pytanie do pytającego: co wydaje ci się że znaczy CLI, a co to jest „aplikacja okienkowa”? Bo rzeczywiście chyba mylisz pojęcia i próbujesz zrobić coś dziwnego.

Witaj,

być może mylę pojęcia bo totalnie nie mam doświadczenia w Visual Studio... sytuacja zmusiła mnie do użycia tego, ponieważ SDK jakie jest dostępne istnieje tylko pod to środowisko:(
Jeśli chodzi o CLI i aplikację okienkową... na chwilę obecną mam działającą aplikację konsolową, w której zamiast typowej metody main(), mam Microsoftową _tmain()...
Aplikacja wykonuje się z wiersza poleceń, chciałem ją przerobić na projekt, w którym będę mógł dodać w designerze formatkę, na której poumieszczam komponenty typu EditBox, ListBox itd.. - bardziej przyjazne dla użytkownika.
Niestety w tym typie projektu, przy dodawaniu nowego elementu, nie mam możliwości dodania UI/Formularz systemu WIndows..
Jest w sieci trochę dostępnych porad jak przerobić aplikację "konsolową" na "okienkową", np tu
ale po wykonaniu wszystkich kroków, zaczyna mi sypać błędami na które google milczy, a które nic mi nie mówią.. wiem tylko że dotyczą np wchar_t .. pojawia się też taki, który dotyczy
IStillImage :

*error LNK2028: unresolved token (0A000052) "extern "C" long __stdcall StiCreateInstanceW(struct HINSTANCE__ *,unsigned long,struct IStillImageW * *,struct IUnknown *)" (?StiCreateInstanceW@@$$J216YGJPAUHINSTANCE__@@KPAPAUIStillImageW@@PAUIUnknown@@@Z) referenced in function "int __cdecl testowa(void)" (?testowa@@$$FYAHXZ)*

podobna sytuacja dotyczy konstruktora CComPtr... w wersji konsolowej używam biblioteki atlcomcli.h, natomiast w wersji z formą wykrzacza mi się na tej bibliotece i tym konstruktorze..
A chciałem zrobić prościutką aplikację, która pozwoli z wykorzystaniem StillImage lub WiaDevMgr na zarejestrowanie w Events dla skanera dodatkowej aplikacji :)

pozdrawiam i dziękuje za zainteresowanie tematem:)

0

na chwilę obecną mam działającą aplikację konsolową, w której zamiast typowej metody main(), mam Microsoftową _tmain()

To bez znaczenia.

zaczyna mi sypać błędami na które google milczy, a które nic mi nie mówią.. wiem tylko że dotyczą np wchar_t

Błędy nie dotyczą wchar_t.

Niestety w tym typie projektu, przy dodawaniu nowego elementu, nie mam możliwości dodania UI/Formularz systemu WIndows..

Trzeba utworzyć projekt CLR Console Application.

0
Azarien napisał(a):

Trzeba utworzyć projekt CLR Console Application.

no niestety, utworzenie projektu CLR Console Application i przeniesienie do niej kodu powoduje nadal błędy typu:

*1>ConsoleApplication1.obj : error LNK2028: unresolved token (0A000158) "extern "C" wchar_t * __stdcall SysAllocStringByteLen(char const *,unsigned int)" (?SysAllocStringByteLen@@$$J18YGPA_WPBDI@Z) referenced in function "public: wchar_t * __thiscall ATL::CComBSTR::Copy(void)const " (?Copy@CComBSTR@ATL@@$$FQBEPA_WXZ)*

pozdrawiam

Michał

0

Twój kod korzysta z niestandardowych bibliotek, więc jak przeniesiesz go do projektu, który tych bibliotek nie linkuje to otrzymasz takie właśnie błędy. Sprawdź z jakich elementów/mechanizmów korzystasz, które skompilują się tylko z CLI.

1

Porównaj opcje linkera w obu projektach, zwłaszcza dołączane libki.
Sprawdź też czy ten nowy projekt nie ma wyłączonych standardowych bibliotek, bo coś kojarzę że tak jest pod Visualem jak się utworzy projekt CLR.

0
Azarien napisał(a):

Porównaj opcje linkera w obu projektach, zwłaszcza dołączane libki.
Sprawdź też czy ten nowy projekt nie ma wyłączonych standardowych bibliotek, bo coś kojarzę że tak jest pod Visualem jak się utworzy projekt CLR.

Jesteś WIELKI !!!!:)

już wszystko cudnie działa :)

pozdrawiam i dziękuję

Michał

0

Witajcie.. mam jeszcze jedno pytanie ogólne odnośnie środowiska Visual Studio... ponieważ po skompilowaniu programu poprawnie działa on na komputerze z zainstalowanym Visual Studio.. na innym komputerze najpierw krzyczał o braku biblioteki vcruntime140d.dll, więc zainstalowałem Visual C++ Redistributable for Visual Studio 2015, to teraz krzyczy o bibliotekę ucrtbased.dll.. Testowałem rozwiązania proponowane przez wujka Google, ale żadne nie pomogło...
Jak sobie z tym poradzić ?

pozdrawiam

Michał

0

@szuwi: to powinien by osobny wątek. Może @kq będzie na tyle dobry i przeniesie? Co do pytania, najpierw sprawdź czy dla konfiguracji release używasz statycznych wersji bibliotek, czyli konfiguracji -MT.

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