Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dll, постоянно вылетает 
:(
    Опции темы
chaos
  Дата 18.3.2005, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 4
Всего: 44



Постоянно выскакивают ошибки
вот текст длл
Код

#include <iostream.h>
#include <afx.h>

extern "C" __declspec(dllexport)
void StartCheck(int b)
{
    CString a;
    a="sadsadsad";
    cout << (LPCSTR)a << endl;
}

а вот сама программа
Код

const MAX_LEN_NAME = 100;

typedef void (WINAPI *TDllFunc)(int);

TDllFunc proba;

void test()
{
    HINSTANCE hLib=LoadLibrary("ckdb.DLL");
    if(hLib==NULL) 
    {
       cout << "Unable to load library!" << endl;
       return;
    } 

   char mod[MAX_LEN_NAME];
   GetModuleFileName((HMODULE)hLib, (LPTSTR)mod, MAX_LEN_NAME);
   cout << "Library loaded: " << mod << endl;
   proba=(TDllFunc)GetProcAddress((HMODULE)hLib, "StartCheck");

    proba(5);
    FreeLibrary((HMODULE)hLib);
}


народ подскажите в чем тут дело

Это сообщение отредактировал(а) chaos - 18.3.2005, 10:02
PM WWW   Вверх
NiJazz
Дата 18.3.2005, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



chaos
Чтобы узнать, на какой строке вылетает, сделай отладку.
PM MAIL   Вверх
chaos
Дата 18.3.2005, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 4
Всего: 44



я думаю что проблема в передаче параметров те в последовательности
stdcall...
PM WWW   Вверх
kometa_triatlon
Дата 5.5.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Блин, та же ошибка smile
Если конкретнее:

"Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention."

Появилась она когда заменил
typedef void (WINAPI* cfunc)(); на typedef void (WINAPI* cfunc)(int, int, int);
Причем выскакивает как раз перед FreeLibrary.
???
Да, и еще.
Код

typedef void (WINAPI* cfunc)(int, int, int);

void CMainFrame::OnRun()
{
    CAttribDlg dlg;
    if( dlg.DoModal() == IDOK){
        m_hLib=LoadLibrary("lab7dll.dll");
        if(m_hLib==NULL) 
        {    
            AfxMessageBox("Unable to load library");
            return;
        }
        GetModuleFileName((HMODULE)m_hLib, m_strMod, 50);
       

        cfunc CreateLabirint;
        
        CreateLabirint=(cfunc)GetProcAddress((HMODULE)m_hLib, "CreateLabirint");
     
        if(CreateLabirint==NULL) 
        {
        AfxMessageBox("Unable to load function");
        FreeLibrary((HMODULE)m_hLib);
        return;
        }
        CreateLabirint((int)dlg.m_iEntrNum, (int)dlg.m_iExitNum ,dlg.m_sliderRarity.GetPos());

        FreeLibrary((HMODULE)m_hLib);
        //Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
    }
}

То есть в диалоговом окне выбираю параметры, затем передаю в функцию.
m_iEntrNum и m_iExitNum - тип DWORD, m_sliderRarity - slider control
Если в СreateLabirint передать константы, например СreateLabirint(5,5,4); то работает нормально (то есть выскакивает только одна ошибка =) ), а если так, как здесь сделано, то получается пугающий Abort. smile
Интересно, почему? Какая разница?


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Nastya
Дата 5.5.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 1
Всего: 44



Пройдись в самой функции по отладке.
Возможно гд-то внутри была некорректная работа с памятью и нарушился стек или что-то еще


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Fantasist
Дата 7.5.2005, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 1
Всего: 41



Цитата(chaos @ 18.3.2005, 07:01)
extern "C" __declspec(dllexport)
void StartCheck(int b)


Цитата(chaos @ 18.3.2005, 07:01)
typedef void (WINAPI *TDllFunc)(int);
TDllFunc proba;



А вы в курсе, что extern "C" - это cdecl, а WINAPI - это stdcall?


kometa_triatlon покажи,, как ты функцию CreateLabirint объявляешь в dll.




--------------------
Волны гасят ветер...
PM MAIL   Вверх
kometa_triatlon
Дата 8.5.2005, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Код

// lab7dll.h : main header file for the lab7dll DLL
//

#pragma once
#include <afxwin.h>

#ifndef __AFXWIN_H__
    #error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"        // main symbols


// Clab7dllApp
// See lab7dll.cpp for the implementation of this class
//


class Clab7dllApp : public CWinApp
{
public:
    Clab7dllApp();

// Overrides
public:
    virtual BOOL InitInstance();
    DECLARE_MESSAGE_MAP()
};

extern "C" __declspec(dllexport) 
int CreateLabirint(int entrNum, int exitNum, int rarity);


Код

// lab7dll.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include ".\lab7dll.h"
#include "Labirint.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//
//    Note!
//
//        If this DLL is dynamically linked against the MFC
//        DLLs, any functions exported from this DLL which
//        call into MFC must have the AFX_MANAGE_STATE macro
//        added at the very beginning of the function.
//
//        For example:
//
//        extern "C" BOOL PASCAL EXPORT ExportedFunction()
//        {
//            AFX_MANAGE_STATE(AfxGetStaticModuleState());
//            // normal function body here
//        }
//
//        It is very important that this macro appear in each
//        function, prior to any calls into MFC.  This means that
//        it must appear as the first statement within the 
//        function, even before any object variable declarations
//        as their constructors may generate calls into the MFC
//        DLL.
//
//        Please see MFC Technical Notes 33 and 58 for additional
//        details.
//

// Clab7dllApp

BEGIN_MESSAGE_MAP(Clab7dllApp, CWinApp)
END_MESSAGE_MAP()


// Clab7dllApp construction

Clab7dllApp::Clab7dllApp()
{
    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
}


// The one and only Clab7dllApp object

Clab7dllApp theApp;


// Clab7dllApp initialization

BOOL Clab7dllApp::InitInstance()
{
    CWinApp::InitInstance();

    return TRUE;
}

extern "C" __declspec(dllexport) 
int CreateLabirint(int entrNum, int exitNum, int rarity){
    CLabirint Labirint(rarity);
    Labirint.setEntrances( entrNum );  
    Labirint.setExits( exitNum );          
    return Labirint.searchMaxPathNum();
    

}


Чтобы мало не показалось smile
В dll есть мой класс CLabirint, работаю с ним.


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Fantasist
Дата 9.5.2005, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 1
Всего: 41



kometa_triatlon.

Эх-эх.... Еще раз:

Цитата(kometa_triatlon @ 7.5.2005, 21:38)
extern "C" __declspec(dllexport)
int CreateLabirint(int entrNum, int exitNum, int rarity)


Цитата(kometa_triatlon @ 5.5.2005, 11:29)
typedef void (WINAPI* cfunc)(int, int, int);


extern "C" - это cdecl (по умолчанию). WINAPI - это stdcall.


Вот это вот сообщение:

Цитата(kometa_triatlon @ 5.5.2005, 11:29)
"Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention."


прямым текстом указывает в чем проблема.




--------------------
Волны гасят ветер...
PM MAIL   Вверх
kometa_triatlon
Дата 10.5.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Вау. А что такое? cdecl, stdcall? smile Ну не знаю, с кем не бывает smile
Ну а как же избавиться от проблемы? Что изменить?



--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Fantasist
Дата 10.5.2005, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 1
Всего: 41



Цитата(kometa_triatlon @ 10.5.2005, 14:07)
А что такое? cdecl, stdcall?


Реккомендуется посмотреть хелп. Зачем мне в него лезть и копировать сюда?


Цитата(kometa_triatlon @ 10.5.2005, 14:07)
Ну а как же избавиться от проблемы?


Поменяй либо объявление в dll на такое:

Код

__declspec(dllexport) int __stdcall CreateLabirint(int entrNum, int exitNum, int rarity)


(здесь могут возникнуть проблемы с декорацией имен и тогда нужен будет .DEF файл)

либо в ехе:

Код

typedef void (*cfunc)(int, int, int);



--------------------
Волны гасят ветер...
PM MAIL   Вверх
kometa_triatlon
Дата 10.5.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Fantasist
smile Заработало
Спасибо


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.