1. Мегаконкурс в апреле "Приведи друзей на codeby". Дарим деньги, подписку на журнал хакер и выдаем статус "Paid Access". Подробнее ...

    Скрыть объявление

Подключение Dll к Visual C++ 2005

Тема в разделе "MS Visual C++", создана пользователем mike2007, 30 июл 2007.

Наш партнер Genesis Hackspace
Статус темы:
Закрыта.
  1. mike2007

    mike2007 Гость

    Помогите пожалуйста уже неделю не могу разобраться с этем.

    DLL(sampel.dll) с функциями:
    int Picture_windows();
    int CVICALLBACK BinarySwitchData();
    int CVICALLBACK NumericKnobData();
    int CVICALLBACK QuitCallback();

    Как запустить функцию "int Picture_windows();" в DLL-ке, созданной в LabView8/CVI, которая выводит на экран элементы: ручки, лампочки и т.д., в проекте Win32.

    А это код проекта С++

    Код (Text):
    #include <windows.h>
    #include "stdafx.h"
    #include "sam.h"

    #define MAX_LOADSTRING 100

    // Global Variables:
    HWND hwndEdit;      // Окно редактирования
    HINSTANCE hInst,hRTFLib;                                // current instance

    char szTitle[MAX_LOADSTRING] = "Топливо и масло";                  // The title bar text
    //TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text
    TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name

    // Forward declarations of functions included in this code module:
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);


    int WINAPI _tWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR  lpCmdLine,
    int   nCmdShow)
    {
    //UNREFERENCED_PARAMETER(hPrevInstance);
    //UNREFERENCED_PARAMETER(lpCmdLine);
    MSG msg;
    HACCEL hAccelTable;

    //LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_SAM, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SAM));
    while (GetMessage(&msg, NULL, 0, 0))
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }
    return (int) msg.wParam;
    }



    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SAM));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_SAM);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
    }

    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
    HWND hWnd;

    hInst = hInstance; // Store instance handle in our global variable

    hWnd = CreateWindowEx(
    0,                  // Расширенный стиль окна
    szWindowClass,      // Имя класса окна
    szTitle,    // Заголовок окна
    WS_OVERLAPPEDWINDOW,// Стиль окна
    CW_USEDEFAULT,      // x
    CW_USEDEFAULT,      // y
    CW_USEDEFAULT,      // ширина
    CW_USEDEFAULT,      // высота
    NULL,               // Хэндл родителя (отсутствует)
    NULL,               // Хэндл меню (отстутствует)
    hInstance,              // Хэндл приложения
    NULL
    );              // Указатель на область данных

    if (!hWnd)
    {
    return FALSE;
    }

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    return TRUE;
    }
    BOOL WndProc_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
    /* Выполняется при создании окна */
    {
    RECT rc;


    hRTFLib = LoadLibrary("sample.dll");

    if (hRTFLib == 0)
    {
    MessageBox(0,_T("Модуль кригинга не найден!"),0,MB_ICONERROR);
    return false;
    }
    //_declspec(dllimport) int _cdecl Picture_windows();
    Picture_windows();
    GetClientRect(hwnd, &rc);
    /*
    hwndEdit = CreateWindowEx(
    NULL,       // Расширенный стиль окна
    "RICHEDIT", // Класс окна редактирования
    NULL,       // Текст в окне по умолчанию
    WS_VISIBLE | WS_CHILD | WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_NOHIDESEL |
    ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_MULTILINE ,
    0, 0, rc.right - rc.left, rc.bottom - rc.top,
    hwnd,       // Родительское окно
    NULL,       // Меню
    hInst,      // Дескриптор приложения
    NULL);      // Указатель на CREATESTRUCT
    *//*| ES_SAVESEL*/
    //PopFileInitialize(hwnd);

    SetFocus(hwndEdit);

    return TRUE;
    } // WndProc_OnCreate
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate);      // Создание окна   
    case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }

    // Message handler for about box.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE;

    case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }
    return (INT_PTR)FALSE;
    }
    Ошибка: error C3861: 'Picture_windows': identifier not found
    Вот не могу понять, как должны прорисоваться все элементы.

    И не знаю как добавить DLL к проекту С++.
     
  2. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.032
    Симпатии:
    6
    ну для начала стоило бы разобраться что такое статическое и динамическое подключение. в твоем случе смотри на GetProcAddress.
     
  3. mike2007

    mike2007 Гость

    Все библиотека подключена из LabView\CVI, только не работает.
    Можно вообще каким-либо образом заствить работать функцию LoadPanel (0, "mydll.uir", PANEL) совместно с
    int CVICALLBACK DataNUMERICTANK
    int CVICALLBACK DataNUMERICGAUGE
    int CVICALLBACK QuitCallback
    в С++.
    У меня ошибка такого рода в С++:
    The callback function, DataNUMERICTANK, specified in UIR file, is not know function. If you are using an external cmpiler, you must include the UIR callback object or source file in the executable or DLL

    Вот код:
    Код (Text):
    BOOL WndProc_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
    /* Выполняется при создании окна */
    {
    RECT rc;


    hRTFLib = LoadLibrary("mydll.dll");

    if (hRTFLib == 0)
    {
    MessageBox(0,_T("DLL не найдена!"),0,MB_ICONERROR);
    return false;
    }
    /*
    определяем при помощи typedef новый тип - указатель на вызываемую функцию.
    Очень важно знать типы и количество аргументов, а также тип возвращаемого
    результата
    */
    typedef int (*PMyDll)(/*const int, const int*/);
    /* пытаемся получить адрес функции getSum */
    PMyDll pMyDll = (PMyDll)GetProcAddress(hRTFLib, "Write_pic");
    /* проверяем успешность получения адреса */
    if (pMyDll == NULL)
    {
    MessageBox(0,_T("Функция не найдена!"),0,MB_ICONERROR);
    return false;
    }
    int iCode =(*pMyDll)();
    Все библиотека подключена из LabView\CVI, только не работает.
    Можно вообще каким-либо образом заствить работать функцию LoadPanel (0, "mydll.uir", PANEL) совместно с
    int CVICALLBACK DataNUMERICTANK
    int CVICALLBACK DataNUMERICGAUGE
    int CVICALLBACK QuitCallback
    в С++.
    У меня ошибка такого рода в С++:
    The callback function, DataNUMERICTANK, specified in UIR file, is not know function. If you are using an external cmpiler, you must include the UIR callback object or source file in the executable or DLL

    Вот код:
    Код (Text):
    BOOL WndProc_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
    /* Выполняется при создании окна */
    {
    RECT rc;


    hRTFLib = LoadLibrary("mydll.dll");

    if (hRTFLib == 0)
    {
    MessageBox(0,_T("DLL не найдена!"),0,MB_ICONERROR);
    return false;
    }
    /*
    определяем при помощи typedef новый тип - указатель на вызываемую функцию.
    Очень важно знать типы и количество аргументов, а также тип возвращаемого
    результата
    */
    typedef int (*PMyDll)(/*const int, const int*/);
    /* пытаемся получить адрес функции getSum */
    PMyDll pMyDll = (PMyDll)GetProcAddress(hRTFLib, "Write_pic");
    /* проверяем успешность получения адреса */
    if (pMyDll == NULL)
    {
    MessageBox(0,_T("Функция не найдена!"),0,MB_ICONERROR);
    return false;
    }
    int iCode =(*pMyDll)();
     
  4. mike2007

    mike2007 Гость

    Прописал в LabView8/CVI :
    Код (Text):
    #ifdef __cplusplus
    extern "C" {
    #endif


    void __cdecl OpenPanel();


    #ifdef __cplusplus
    }
    #endif
    Все равно ошибка, в VC++:
    testDLLDlg.obj : error LNK2001: unresolved external symbol "void __cdecl OpenPanel(void)" (?OpenPanel@@YAXXZ)
    Debug/testDLL.exe : fatal error LNK1120: 1 unresolved externals

    Что с ней делать не могу понять.
    Помогите Пожалуйста!
     
  5. Ninetta

    Ninetta Гость

    А у меня такой вопрос - если я статически подключаю библиотеку, достаточно всего лишь строчки
    #pragma comment(lib, "NeuroNet.lib") ???

    И как теперь пользоваться функциями этой билиотеки? Почему в ClassView она не отображается???

    Заранее спасибо.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей