Skocz do zawartości

Zablokowane Błąd w Visual C++ nie spowodowany kodem


Gość

Rekomendowane odpowiedzi

Witam wszystkich :)

Mam taki problem. Zacząłem sobie coś bazgrać w C++, ale napotkałem taki błąd:

1>------ Build started: Project: 10TEAM, Configuration: Debug Win32 ------
1>  Stdafx.cpp
1>  10TEAM.cpp
1>c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(96): error C2872: 'IServiceProvider' : ambiguous symbol
1>          could be 'c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(53) : System::IServiceProvider IServiceProvider'
1>          or       'c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : System::IServiceProvider'
1>c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(96): error C3699: '*' : cannot use this indirection on type 'IServiceProvider'
1>          compiler replacing '*' with '^' to continue parsing
1>c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(103): error C2371: 'IServiceProvider' : redefinition; different basic types
1>          c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(53) : see declaration of 'IServiceProvider'
1>c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(120): error C2872: 'IServiceProvider' : ambiguous symbol
1>          could be 'c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(103) : IServiceProvider'
1>          or       'c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : System::IServiceProvider'
1>c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(241): error C2872: 'IServiceProvider' : ambiguous symbol
1>          could be 'c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(103) : IServiceProvider'
1>          or       'c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : System::IServiceProvider'
1>c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(251): error C2872: 'IServiceProvider' : ambiguous symbol
1>          could be 'c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(103) : IServiceProvider'
1>          or       'c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : System::IServiceProvider'
1>C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\urlmon.h(6459): error C2872: 'IServiceProvider' : ambiguous symbol
1>          could be 'c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(103) : IServiceProvider'
1>          or       'c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : System::IServiceProvider'
1>C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\urlmon.h(6461): error C2872: 'IServiceProvider' : ambiguous symbol
1>          could be 'c:\program files\microsoft sdks\windows\v7.0a\include\servprov.h(103) : IServiceProvider'
1>          or       'c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll : System::IServiceProvider'
1>  AssemblyInfo.cpp
1>  Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Nie jest on spowodowany kodem, wyeliminowałem wszystkie błędy w kodzie.

Czym jest to spowodowane i jak można to naprawić? Czy z takim błędem biblioteka będzie działała poprawnie?

Odnośnik do komentarza
Udostępnij na innych stronach

Czy z takim błędem biblioteka będzie działała poprawnie?

zacznijmy od tego że jej w ogóle nie będzie, bo się z takim błędem nie skompiluje.

 

Czym jest to spowodowane i jak można to naprawić?

pokaż kod który dotyczy tych linijek.

Odnośnik do komentarza
Udostępnij na innych stronach

wiec pokaz ta funkcje.

 

btw. jestes pewny ze nie duplikujesz includowania plikow naglowkowych?

Odnośnik do komentarza
Udostępnij na innych stronach

Właściwie to nie wiem, bo nie wiem czy kompiluje się tylko ten plik, który aktualnie edytuję (czyli 10TEAM.cpp) czy wszystkie. Jeżeli tylko ten jeden, to tak, bo w nim jest wrzucone #include "stdafx.h" i nigdzie indziej nie ma. Natomiast w pliku Stdafx.cpp jest też includowany ten nagłówek. Więc nie wiem, zmieszałem się już.

 

EDIT: Teraz zbesztacie pewnie to co napisałem :P :

#include "stdafx.h"
#include <windows.h>
#define export extern "C" __declspec(dllexport)

export double Message(char* caption, char* text, double icon, double buttons)
{
    /* Icon of message */
    int icon_no = int(icon); // Changing type of variable to INT. GM operate double, now it's converted to INT.
    UINT icon_name; // Value of this variable is a name of icon.
    switch (icon_no)
    {
        case 1: icon_name = MB_ICONEXCLAMATION; break; // If icon_no is equal 1, then icon is "EXCLAMATION"
        case 2: icon_name = MB_ICONINFORMATION; break; // If icon_no is equal 2, then icon is "INFORMATION"
        case 3: icon_name = MB_ICONQUESTION; break; // If icon_no is equal 3, then icon is "QUESTION"
        case 4: icon_name = MB_ICONSTOP; break; // If icon_no is equal 4, then icon is "STOP"
        default: icon_name = MB_ICONINFORMATION; // Default icon name is "INFORMATION"
    }
    /* --------------- */
    /* Buttons of message */
    int buttons_no = int(buttons); // Changing type of variable to INT. GM operate double, now it's converted to INT.
    UINT buttons_name; // Value of this variable is a name of buttons.
    switch (buttons_no)
    {
        case 1: buttons_name = MB_ABORTRETRYIGNORE; break; // If buttons_no is equal 1, then buttons are "Abort, Retry, Ignore"
        case 2: buttons_name = MB_CANCELTRYCONTINUE; break; // If buttons_no is equal 2, then buttons are "Cancel, Try again, Continue"
        case 3: buttons_name = MB_OK; break; // If buttons_no is equal 4, then button is "Ok"
        case 4: buttons_name = MB_OKCANCEL; break; // If buttons_no is equal 5, then buttons are "Ok, Cancel"
        case 5: buttons_name = MB_RETRYCANCEL; break; // If buttons_no is equal 6, then buttons are "Retry, Cancel"
        case 6: buttons_name = MB_YESNO; break; // If buttons_no is equal 7, then buttons are "Yes, No"
        case 7: buttons_name = MB_YESNOCANCEL; break; // If buttons_no is equal 8, then buttons are "Yes, No, Cancel
        default: buttons_name = MB_OK;
    }
    /* ------------------- */
    /* Show message */
    int msg = MessageBox(0, text, caption, icon_name | buttons_name); // Show message
    switch (msg)
    {
        case 1: return 1; break; // OK
        case 2: return 2; break; // CANCEL
        case 3: return 3; break; // ABORT
        case 4: return 4; break; // RETRY
        case 5: return 5; break; // IGNORE
        case 6: return 6; break; // YES
        case 7: return 7; break; // NO
        case 10: return 8; break; // TRY AGAIN
        case 11: return 9; break; // COUNTINUE
        default: return 0;
    }
    /* ----------- */
}

Odnośnik do komentarza
Udostępnij na innych stronach

pokaz calosc, bo tak to w ciemno do zalanej smierci nie zgadniemy :P

Odnośnik do komentarza
Udostępnij na innych stronach

Zmieniłem pierwsze linijki na:

#include "10TEAM.h"
#include "Stdafx.h"
#include <windows.h>
#define export extern "C" __declspec(dllexport)

I teraz jest taki błąd:

1>------ Build started: Project: 10TEAM, Configuration: Debug Win32 ------
1>  10TEAM.cpp
1>10TEAM.cpp(1): warning C4627: '#include "10TEAM.h"': skipped when looking for precompiled header use
1>          Add directive to 'StdAfx.h' or rebuild precompiled header
1>     Creating library c:\users\jabol_dread\documents\visual studio 2010\Projects\10TEAM\Debug\10TEAM.lib and object c:\users\jabol_dread\documents\visual studio 2010\Projects\10TEAM\Debug\10TEAM.exp
1>10TEAM.obj : error LNK2028: unresolved token (0A000027) "extern "C" int __stdcall MessageBoxA(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBoxA@@$$J216YGHPAUHWND__@@PBD1I@Z) referenced in function "extern "C" int __cdecl MessageBox(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PBD1I@Z)
1>10TEAM.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall MessageBoxA(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBoxA@@$$J216YGHPAUHWND__@@PBD1I@Z) referenced in function "extern "C" int __cdecl MessageBox(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PBD1I@Z)
1>c:\users\jabol_dread\documents\visual studio 2010\Projects\10TEAM\Debug\10TEAM.dll : fatal error LNK1120: 2 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Odnośnik do komentarza
Udostępnij na innych stronach

"10TEAM.h" korzysta z "windows.h", a więc on musi być pierwszy.

poza tym ja bym wywalił stdafx w ogóle, na cholibke on w ogóle

Odnośnik do komentarza
Udostępnij na innych stronach

Jak wywalę stdafx (to jest precompiled header) i wyłącze używanie go, to jest ten sam błąd (tj. 2 posty wyżej). I kiedy zostawię samo <windows.h> to też tak samo. Jak używam tamtych includów i wszystko normalnie ustawione, jest ten error co w 1 poście. Jak wywalę stdafx to tak samo - jak w 1 poście.

Odnośnik do komentarza
Udostępnij na innych stronach

ja CI mowie to co widze po tym co pokazales (a pokazales w sumie nic).

10team.h uzywa rzeczy z windows.h, dla tego windows.h musi byc przed 10team.h

Odnośnik do komentarza
Udostępnij na innych stronach

// 10TEAM.h

#pragma once

using namespace System;

namespace My10TEAM {

    public ref class Class1
    {
        // TODO: Add your methods for this class here.
    };
}

Czego on tu używa ?

Dałem go na początek (przed windows.h) i tak samo jak 4 posty wyżej.

Odnośnik do komentarza
Udostępnij na innych stronach

to nie wiem czego on wyrzuca bledy z MessageBox (ktory jest w windows.h)

Odnośnik do komentarza
Udostępnij na innych stronach

No też tego nie wiem :/ A w funkcji wszystko dobrze napisane jest ? (Patrząc nie na optymalność, tylko na poprawność kodu)

 

Edit: Tzn? Nie jestem w tym obeznany.

Odnośnik do komentarza
Udostępnij na innych stronach

dobra, po kolei: pokaz mi schemat na ktorym widac gdzie includujesz windows.h a gdzie uzywasz MessageBox

Odnośnik do komentarza
Udostępnij na innych stronach

zobaczyłęś przykład użycia C#, skopiowałeś bez zastanowienia, więc nie dziw że takie cuda się dzieją. Wywal jak Ci nie potrzebny.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie, nie kopiowałem nic. Stworzyłem projekt w Visual C++ 2010 Express Edition i to już było -_-

Wywaliłem cały ten plik. Tu jest błąd linkera (czy jakoś tak).

Odnośnik do komentarza
Udostępnij na innych stronach

tak, zapodaj projekt na PW

Odnośnik do komentarza
Udostępnij na innych stronach

jasne, wysylam projekt, u mnie sie skompilowalo :)

EDIT: Wysłane :)

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...