powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / [Code::Blocks] ошибки "... was not declared in this scope"
25 сообщений из 35, страница 1 из 2
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835093
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Сразу сказу что в C++ я абсолютный нуб.

Установил Code::Blocks и пытаюсь скомпилировать простенький вроде код, но получаю ошибки
автор... was not declared in this scope
В опциях компилятора пробовал указывать поддержку c++11 и c++14 , но не помогло
Как это скомпилировать?
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835101
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
#include <windows.h>
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835105
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin,

Спасибо!
Теперь ругается так:
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835107
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На случай если ты не знаешь: в Code::Blocks можно копировать текст ошибки в буфер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835109
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо полагать, что LoadLibrary нужно заменить на LoadLibraryA или LoadLibraryW, я хз, но может помочь (а может не помочь).

А вообще это не от кодеблокс зависит... И гуглинг тут помогает.
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835125
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это WinAPI, то там

HINSTANCE LoadLibrary(
LPCTSTR lpLibFileName // address of filename of executable module
);

а не LPWSTR...
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835129
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заработало:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#include <iostream>
#include <cstdlib>
#include <windows.h>

using namespace std;

int main()
{
    HINSTANCE dll_module = LoadLibrary("test.dll"); // загрузка модуля DLL

    if(dll_module == NULL) {
        std::cout << "\nLibrary NOT loaded!";
    } else {
        std::cout << "\nLibrary loaded.";
    }

    LPCSTR func_name = "GetLangId"; // название загружаемой функции
    FARPROC func_addr = GetProcAddress(dll_module, func_name);

    if (func_addr != 0) {
        std::cout << "\nfunc_addr = " << func_addr;
        // typedef int (__cdecl *int)(void);
        // func_addr();
    }

    FreeLibrary(dll_module);

    std::cout << "\n";
    std::system("pause");

    return 0;
}



Непонятно вот что - для любого правильного имени функции в консоли выводится
авторfunc_addr = 1
Как я понимаю там должны быть разные значения для разных функций, а выводится всегда 1
Что не так?
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835144
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглил что такое FARPROC - указатель. По-видимому так просто в строку не конвертируется.
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835162
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerПогуглил что такое FARPROC - указатель.

Гугли дальше:
https://stackoverflow.com/questions/53129402/why-pointer-to-function-is-equal-to-1
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835163
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь пытаюсь вызвать функцию с параметром ( SetLangId ) и в ответ получаю заведомо неверное значение - ответ приходит FALSE, тогда как функция всегда возвращает TRUE

Код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
#include <iostream>
#include <cstdlib>
#include <windows.h>

using namespace std;

int main()
{
    HINSTANCE dll_module = LoadLibrary("test.dll"); // загрузка модуля DLL

    if(dll_module == NULL) {
        std::cout << "\nLibrary NOT loaded!" << endl;
    } else {
        std::cout << "\nLibrary loaded." << endl;
    }

    FARPROC SetLangId = GetProcAddress(dll_module, "SetLangId");
    FARPROC GetLangId = GetProcAddress(dll_module, "GetLangId");
    int LangId;
    BOOL flg;

    if (GetLangId != 0) {
        LangId = GetLangId();
        std::cout << "LangId = " << LangId << endl;
    }

    if (SetLangId != 0) {
        std::cout << "SetLangId = " << SetLangId << endl;

        typedef BOOL (*SetLangId_funtype)(int);
        flg = ((SetLangId_funtype)SetLangId)(0);
        std::cout << "flg = " << flg << endl; // <<<<< ------- ЗДЕСЬ ВЫВОДИТ: flg = -1

        if (flg == TRUE) {
            if (GetLangId != 0) {
                LangId = GetLangId();
                std::cout << "LangId = " << LangId << endl;
            }
        }
    }

    FreeLibrary(dll_module);

    std::cout << "\n";

    return 0;
}



Возможно что-то не так с объявлением типа функции?

DLL написана на Delphi и заголовок функции выглядит так:
Код: pascal
1.
function SetLangId(id: Integer): BOOL; stdcall;



Как мне ее правильно вызвать?
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835173
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerВозможно что-то не так с объявлением типа функции?

А сравнить объявления побуквенно и заметить отсутствие в одном из них STDCALL?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835175
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Я сразу написал наверху, что я нуб в C++ . Это первый мой опыт, так что не сильно кидайтесь тапками ))
Как мне правильно вызвать эту функцию?
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835177
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так пробовал:
Код: plaintext
1.
typedef BOOL (__stdcall* SetLangId_funtype)(int);


Но не помогло
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835187
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerЯ сразу написал наверху, что я нуб в C++ .

Ну так умение сравнивать буквы вроде бы языконезависимое...

Теперь копай дальше: выясняй что такое BOOL в Си и что такое BOOL в Delphi (размеры). Это
тот случай, когда совпадение букв не гарантирует совпадения содержимого.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835436
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Для типа BOOL и Delphi и в C++ FALSE = 0, а вот TRUE в Delphi содержит -1.
То есть ответ пришел тот что и должен был прийти, но для C++ это значение не является TRUE

Получается, при написании DLL на Delphi следует избегать использования булевского типа?
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835448
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerДля типа BOOL и Delphi и в C++ FALSE = 0, а вот TRUE в Delphi содержит -1.
То есть ответ пришел тот что и должен был прийти, но для C++ это значение не является TRUE
И в чем тут противоречие? -1 для С++ это TRUE.

Тебе же написали: размеры проверяй. В С++ BOOL - 4 байта, bool - 1 байт. Как оно в дельфи - хз.
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835463
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

В Дельфи:
BOOL = 4 байта
true = -1 ($FFFFFFFF)
false = 0

Я вычитал что в C++ для типа BOOL true = 1 поэтому и увидел противоречие
( https://www.transl-gunsmoker.ru/2009/04/bool-boolean-integer.html )

код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        typedef BOOL (__stdcall* SetLangId_funtype)(int);
        flg = ((SetLangId_funtype)SetLangId)(1);
        std::cout << "\nflg = " << flg; // <<<<< ------- ЗДЕСЬ ВЫВОДИТ: flg = -1

        if (flg == TRUE) {
            // --------------------------------------- <<< сюда не заходит
            if (GetLangId != 0) {
                LangId = GetLangId();
                std::cout << "\nLangId = " << LangId;
            }
        }


Тут получается так, что функция возвращает True и в консоль выводится "-1" , но в flg НЕ содержится значение TRUE
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835465
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С/С++ true это все что не 0.
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835468
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо так писать
Код: plaintext
1.
if (flg == TRUE) {


Лучше так
Код: plaintext
1.
if (flg) {
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835471
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе надо так писать
Код: plaintext
1.
if (flg == TRUE) {


Лучше так
Код: plaintext
1.
if (flg) {



По второму варианту заработало :))
Спасибо. Но почему не работает по первому?
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835474
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь пытаюсь получить строку:

Заголовок функции в дельфи:
Код: pascal
1.
function GetLastErrText: BSTR; stdcall;



Код: plaintext
1.
2.
3.
4.
    BSTR str;
    typedef BSTR (__stdcall* GetLastErrText_funtype)();
    str = (GetLastErrText_funtype)GetLastErrText(); // <<<<<<<< ОШИБКА
    std::cout << "\nstr = " << str;



Получаю ошибку при компиляции:
cannot convert 'GetLastErrText_funtype {aka wchar_t* (__attribute__((__stdcall__)) *)()}' to 'BSTR {aka wchar_t*}' in assignment
Что не так?
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835482
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talkerпочему не работает по первому?

Код: sql
1.
#define TRUE 1


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835534
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ясно, спасибо!

По поводу последней ошибки компиляции есть мысли в чем может быть причина?
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835546
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talkerесть мысли в чем может быть причина?

В том, что написанный код - бессмысленный бред.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[Code::Blocks] ошибки "... was not declared in this scope"
    #39835605
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по всему тут неправильно написана работа с типом BSTR. Можете поправить код или подсказать что поправить?
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / [Code::Blocks] ошибки "... was not declared in this scope"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]