Poszukiwany mfc140d.dll dla Visual Studio 2017

Poszukiwany mfc140d.dll dla Visual Studio 2017

Wątek przeniesiony 2020-09-21 21:00 z Hardware/Software przez kq.

BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:4 minuty
  • Postów:305
0

Witam, poszukuję podpowiedzi skąd pobrać mfc140d.dll dla Visual Studio 2017, podczas debugowania dostaję błąd pokroju:
screenshot-20200921165006.png
kiedy go zignoruję mogę sobie debbugować dalej.

Dodam, że dzieje się to tylko wtedy, gdy CRecordset ma rzucić wyjątkiem, że np. nie udało się poprawnie wykonać zapytania sql-owego lub nie istnieje dana kolumna.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 dni
  • Lokalizacja:Szczecin
2

Jeśli możesz debugować to masz ten plik zainstalowany z VS. Ten typ błędu to prawdopodobnie out-of-bound access na jakimś kontenerze standardowym - zobacz przy jakiej operacji w twoim kodzie jest wywoływany (np. przy operatorze []?)


BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:4 minuty
  • Postów:305
0

Wywoływany jest wtedy, jeżeli próbuję CRecordset::GetFiledValue wyjść po za zakres, np. select zawiera 2 kolumny, a ja próbuję "siegnąć" 3 kolumnę, bądź zrobiłem literówkę przy nazwie kolumny, o którą pytam.

Co ciekawe, złapałem to w blok try-catch i w release nie ma problemu, wyjątek jest prawidłowo łapany i treść błędu SQL-a także, natomiast taka sytuacja ma miejsce podczas debugowania

kq
W takim razie jeśli pomogłem to 👍 lub ✓ ;​)
BartoSAS
Tak, tak jak najbardziej, tylko zastanawia mnie, czemu w trybie debug wysypuje się VS, a jak jest w release, to wszystko jest w porządku
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 godzin
3
BartoSAS napisał(a):

Co ciekawe, złapałem to w blok try-catch i w release nie ma problemu, wyjątek jest prawidłowo łapany i treść błędu SQL-a także, natomiast taka sytuacja ma miejsce podczas debugowania

Debugger jest czasami nadgorliwy i zgłasza wyjątki nawet jeśli są one w kodzie łapane. Jeśli wyjątek ten nie jest na porządku dziennym (a nie powinien!) to po prostu go ignoruj podczas debugowania. Nic złego się nie dzieje.

tldr: nie wychodź poza zakres i nie rób literówek :)

edytowany 1x, ostatnio: Azarien
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12175
1
BartoSAS napisał(a):

Co ciekawe, złapałem to w blok try-catch i w release nie ma problemu, wyjątek jest prawidłowo łapany i treść błędu SQL-a także, natomiast taka sytuacja ma miejsce podczas debugowania

Jeśli dobrze rozumiem, to to właśnie ma tak działać – w debug pojawia się komunikat z informacją o wyjątku i można podjąć odpowiednią akcję, natomiast w release wyjątek jest łapany, obsługiwany i program dalej działa normalnie.

Czyli VS zachowuje się dokładnie tak samo jak Delphi czy Lazarus – nic nadzwyczajnego.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:4 minuty
  • Postów:305
0

@Azarien: robiłem smutny wrapper na CRecordset, żeby było wygodniej robić zapytania :/
@furious programming niewykluczone, ale Señor developer uznał, że to niedopuszczalne, bo wcześniej na gołych wskaźnikach nie było takich reakcji, więc try-catch do zezłomowania pójdzie prawdopodobnie :(

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 dni
  • Lokalizacja:Szczecin
3

Zamiast try/catch po prostu nie wywołuj funkcji na nieistniejących indeksach...


MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
1
BartoSAS napisał(a):

Co ciekawe, złapałem to w blok try-catch i w release nie ma problemu, wyjątek jest prawidłowo łapany i treść błędu SQL-a także, natomiast taka sytuacja ma miejsce podczas debugowania

W trybie budowania Debug na Visual studio std::vector::operator[] sprawdza zakres indeksu i rzuca wyjątkiem za pomocą asercji!
Ten wyjątek, to jest nie jest wyjątek C++, więc try catch nic tu nie da, to jest asercja w stylu C, która natychmiast zatrzymuje program.

W trybie budowania release std::vector::operator[] nie robi sprawdzania i wtedy dostęp do indeksów z poza zakresu jest po prostu Niezdefiniowanym Zachowaniem (może zdarzyć się cokolwiek, w tym nic).
Ergo kq dobrze ci mówi, masz poważny błąd w programie, który MUSISZ naprawić.

Odpal program z IDE w trybie debugwania (F5) (bo to co pokazujesz to jest normalnie włączony program, który jest zbudowany pod Debug) i jak się pojawi błąd to przeanalizuj Call Stack.

Albo jeśli wolisz swoją metodą, to jak wyskoczy ci to okienko, to wtedy naciśnij "Ponów", zgódź się na debugowanie i wybierz właściwa instancję VS. Wtedy też przeanalizuj Call Stack.

W Visual Studio można ustawić na jakie wyjątki powinien reagować Debugger. Ale to nie jest wyjątek w rozumieniu C++.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 7x, ostatnio: MarekR22
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:4 minuty
  • Postów:305
0

Dla sprostowania, bo może się nie zrozumieliśmy: sytuacja w której to się dzieje:

Kopiuj
CRecordset rs(&db);
// Powiedzmy, że są 2 kolumny w tej tabeli
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));

// Create a CDBVariant object to
// store field data
CDBVariant varValue;

try
{
// Błąd w sztuce, nie ma takiej kolumny
rs.GetFieldValue("CUSTOMER_NAME", varValue);
}
catch (CDBException * exception)
	{
			exception->m_strError;
			exception->m_strStateNativeOrigin;
		return 0;
	}
edytowany 1x, ostatnio: cerrato
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:4 minuty
  • Postów:305
0

IsEOF() zwraca true, bo jakieś rekordy istnieją, tyle tylko, że jak się ktoś pomyli, to w exception->m_strError znajduje się treść błędu, że "Kolumna o nazwie x nie istnieje".

@update -> IsEOF() zwraca false

edytowany 1x, ostatnio: BartoSAS
MarekR22
sorry skasowałem post, bo po fakcie zauważyłem w kodzie komentarz, który mówi o nieistniejącej kolumnie. W każdym razie "IsEOF() zwraca true" oznacza, że nie ma rzędów (danych), więc już tu jest błąd.
BartoSAS
Mój błąd - źle napisałem - jestem przekonany, że jest jakiś wynik, tylko po prostu ktoś się pomylił, gdy chciał po niego sięgnąć, wiem, że przykład jest z d*py, ale to tylko dlatego, żeby pokazać, jak w bloku catch "ładnie" łapany jest komunikat z bazy o błędnej składni / nazwie kolumny etc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.