Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2012, 22:25   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию Вызов функции dll из программы на C.

Приветствую! Создал dll в MASM32. В dll единственная функция, которая складывает два переданных числа:

Код:
AddDigs proc val1:DWORD, val2:DWORD
    mov eax, val1
    add eax, val2
    ret
AddDigs endp
Весь код dll:

add.dll
Код:
.386
option casemap:none

include c:\masm32\include\masm32rt.inc 

.data
MessTitle db   "Message", 0
MessText db "I am from dll", 0

.code
LibMain proc instance:dword,reason:dword,unused:dword 
    mov     eax,1
    ret
LibMain     endp
AddDigs proc val1:DWORD, val2:DWORD
    mov eax, val1
    add eax, val2
    invoke MessageBox, 0, addr MessText, addr MessTitle, 0
    ret
AddDigs endp
End LibMain
amakedll.bat:
Цитата:
link /SUBSYSTEM:CONSOLE /DLL /DEF:"%1.def" "%1.obj"
add.def
Цитата:
LIBRARY add
EXPORTS AddDigs
Но не могу вызвать эту фукнцию из программы на Си:



Код:
#include <windows.h>
#include <tchar.h>
#include "resource.h"

#define IDD_DIALOG1 100

INT_PTR CALLBACK DialogProc(HWND hwndDlg,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam);

LPCTSTR DlgName = MAKEINTRESOURCE(IDD_DIALOG1);

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    DialogBoxParam(hInstance, DlgName, NULL, DialogProc, (LPARAM) NULL);

    return TRUE;
}

HMODULE hLib;
FARPROC AddDigsAddr;
int (*AddDigs)(int, int);

INT_PTR CALLBACK DialogProc(HWND hWnd,
                            UINT uMsg,
                            WPARAM wParam,
                            LPARAM lParam)
{
    int result;

    switch(uMsg) {
    case WM_COMMAND:
        if (LOWORD(wParam) == IDC_BUTTON1) {
            hLib = LoadLibrary(_T("add.dll"));
            if (hLib == NULL) {
                MessageBox(NULL, _T("Cannot load library"), _T("Load Library"), MB_OK);
                break;
            }

            AddDigsAddr = GetProcAddress(hLib, "AddDigs");
            if (AddDigsAddr == NULL) {
                MessageBox(NULL, _T("AddDigs function not found"), _T("Load Library"), MB_OK);
                break;
            }

            AddDigs = (int(*)(int, int))AddDigsAddr;

            result = (*AddDigs)(2, 5);

            FreeLibrary(hLib);
        }
        break;
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        break;
    default:
        return FALSE;
    }

    return TRUE;
}
res.rc
Код:
// Generated by ResEdit 1.5.11
// Copyright (C) 2006-2012
// http://www.resedit.net

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"




//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG1 DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Using DLL"
FONT 8, "Ms Shell Dlg"
{
    PUSHBUTTON      "Call function", IDC_BUTTON1, 63, 41, 60, 14
}
Пры вызове функции вылетает ошибка (на этапе выполнения):


Подскажите, пожалуйста, как исправить!

С уважением Иван

Последний раз редактировалось 8Observer8; 04.11.2012 в 22:28.
8Observer8 вне форума Ответить с цитированием
Старый 04.11.2012, 22:36   #2
Vort
Пользователь
 
Аватар для Vort
 
Регистрация: 10.07.2012
Сообщений: 16
По умолчанию

соглашение вызова для функции прописать надо
Vort вне форума Ответить с цитированием
Старый 04.11.2012, 22:48   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от Vort Посмотреть сообщение
соглашение вызова для функции прописать надо
Да, я здесь читал: http://msdn.microsoft.com/en-us/libr...(v=vs.71).aspx Но эксперименты ни к чему не привели.
8Observer8 вне форума Ответить с цитированием
Старый 04.11.2012, 22:54   #4
Vort
Пользователь
 
Аватар для Vort
 
Регистрация: 10.07.2012
Сообщений: 16
По умолчанию

...
int (_stdcall *AddDigs)(int, int);
...
AddDigs = (int(_stdcall*)(int, int))AddDigsAddr;
...
Vort вне форума Ответить с цитированием
Старый 04.11.2012, 22:57   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Хм... почему-то получается: result = 2 + 5 = 1 странно...
8Observer8 вне форума Ответить с цитированием
Старый 04.11.2012, 22:58   #6
Vort
Пользователь
 
Аватар для Vort
 
Регистрация: 10.07.2012
Сообщений: 16
По умолчанию

MessageBox в eax наследила
Vort вне форума Ответить с цитированием
Старый 04.11.2012, 23:01   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Да, точно! Спасибо огромное! Плюс вам в репутацию
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вызов функции из dll в потоке xvs Общие вопросы Delphi 11 29.03.2012 14:11
Вызов функции из DLL Vegas C# (си шарп) 2 19.12.2011 00:57
Вызов функции из DLL(C#) ZverSS88 Помощь студентам 0 25.11.2010 11:27
Повторный вызов функции из dll Smertnik Общие вопросы C/C++ 5 15.05.2009 22:18
Вызов функции из dll-ки VVVadim Общие вопросы Delphi 2 28.04.2009 10:37