Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу использовать функции из DLL, Ошибка при обращении к фнкции 
:(
    Опции темы
Lepton
Дата 12.1.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть библиотека для приема данных от внешнего устройства через COM port. Я пишу прогу для приема данных. Код программы:

Код

#include <iostream>
#include <stdio.h>
#include "stdafx.h"
#include <windows.h>

/*#include "dll_rs232.h"
#pragma comment(lib, "dll_rs232.lib")*/

#define CMacroString ATL::CStringT< char, StrTraitATL< char > >

using namespace std; 


HRESULT Init( CMacroString, DWORD, BYTE , BYTE , BYTE  );
typedef HRESULT (*INIT)( CMacroString, DWORD, BYTE , BYTE , BYTE  );
 

HRESULT UnInit( );
typedef HRESULT (*UNINIT)( );



void main()
{

INIT   pfnMyFunc;   //указатель на  Init
HINSTANCE hMyDll = LoadLibrary(_T("dll_rs232.dll"));
if(hMyDll != NULL)

{   //Определяем адрес функции
   pfnMyFunc= (INIT)GetProcAddress(hMyDll, "Init");

   if(pfnMyFunc== 0)   
   {
      FreeLibrary(hMyDll);
     // return;
   }

//Вызываем функцию
//HRESULT result = pfnMyFunc(_T("COM1"), 115200, 0, 1, 8);

  
   //Выгружаем DLL, если она больше нам не нужна
   
}


FreeLibrary(hMyDll);


UNINIT pMyFunc;  
HINSTANCE hDll = LoadLibrary(_T("dll_rs232.dll"));
if(hDll != NULL)
{
       pMyFunc= (UNINIT)GetProcAddress(hMyDll, "UnInit");

       if(pMyFunc== 0)   
   {
      FreeLibrary(hDll);
     // return;
   }
}

HRESULT res = pMyFunc();

FreeLibrary(hDll);


    system ("pause");
    return;    
}
    




 При вызове функции программа выдает ошибку (не на этапе компиляции, а уже после запуска):
Код

Необработанное исключение в "0x00000000" в "COM_IK.exe": "0xC0000005": Acces violation. 





PM MAIL   Вверх
Dem_max
Дата 12.1.2012, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 16
Всего: 39



может вызываемые функции должны быть как __stdcall ???


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Lepton
Дата 12.1.2012, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не думаю ((
Вот код DLL и h-file

dll_rs232.cpp:
Код

#include "stdafx.h"
#include "dll_rs232.h"
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

CDll_RS232::CDll_RS232( void ):m_bIsConnection( FALSE ) , 
m_SignalDataReceive( NULL )
{
    InvalidateHandle( m_hThread ) ;
    InvalidateHandle( m_hCommPort ) ;
    InvalidateHandle( m_hTerminate ) ;
    InvalidateHandle( m_hThreadStarted ) ;
    InitLock() ;
}
CDll_RS232::~CDll_RS232( void )
{
    DelLock( ) ;
}
void    CDll_RS232::CloseAndClearHandle( HANDLE &h ) 
{ 
    BOOL bRet = CloseHandle( h ) ;

    h = INVALID_HANDLE_VALUE ;
}
void    CDll_RS232::InvalidateHandle( HANDLE &h ) 
{
    h = INVALID_HANDLE_VALUE ;
}
HRESULT    CDll_RS232::Init(
        CMacroString PortName , 
        DWORD dwBaudRate , 
        BYTE byParity , 
        BYTE byStopBits , 
        BYTE byByteSize  )
{
    HRESULT hr = S_OK ;
    if ( m_bIsConnection ) UnInit( ) ;

    try{
        m_hCommPort = CreateFile( PortName ,
            GENERIC_READ | GENERIC_WRITE ,
            NULL , NULL ,
            OPEN_EXISTING ,
            FILE_FLAG_OVERLAPPED ,
            NULL ) ;
        if ( m_hCommPort == INVALID_HANDLE_VALUE ){
            ATLTRACE( "COM port openning failed\r\n" ) ;
            return E_FAIL ;
        }
        ATLTRACE( "COM port openning successfully\r\n" ) ;
        if ( !SetCommMask( m_hCommPort , EV_RXCHAR ) ){
        
            ATLTRACE( "Get Comm Port Mask failed\r\n" ) ;
            return E_FAIL ;
        }
        DCB dcb = { 0 } ;
        if ( !GetCommState( m_hCommPort , &dcb ) ){
    
            ATLTRACE( "Get Comm Port State failed\r\n" ) ;
            return E_FAIL ;
        
        }
        
        dcb.BaudRate    = dwBaudRate;
        dcb.ByteSize    = byByteSize;
        dcb.Parity        = byParity;
        if ( byStopBits == 1 )
            dcb.StopBits    = ONESTOPBIT;
        else if (byStopBits == 2 ) 
            dcb.StopBits    = TWOSTOPBITS;
        else 
            dcb.StopBits    = ONE5STOPBITS;

        dcb.fDsrSensitivity = 0;
        dcb.fDtrControl = DTR_CONTROL_ENABLE;
        dcb.fOutxDsrFlow = 0;

        
        if (!::SetCommState (m_hCommPort,&dcb))
        {

            ATLTRACE( "Set Comm Port State failed\r\n" ) ;
            return E_FAIL ;
        }
        COMMTIMEOUTS timeouts;
        
        timeouts.ReadIntervalTimeout                    = MAXDWORD; 
        timeouts.ReadTotalTimeoutMultiplier        = 0;
        timeouts.ReadTotalTimeoutConstant            = 0;
        timeouts.WriteTotalTimeoutMultiplier    = 0;
        timeouts.WriteTotalTimeoutConstant        = 0;
        
        if (!SetCommTimeouts(m_hCommPort, &timeouts))
        {
    
            ATLTRACE( "Set Comm Port Timeouts failed\r\n" ) ;
            return E_FAIL ;
        }

        m_hTerminate = CreateEvent( NULL , NULL , NULL , NULL ) ;
        m_hThreadStarted = CreateEvent( NULL , NULL , NULL , NULL ) ;

        m_hThread = ( HANDLE )_beginthreadex( NULL , NULL , CDll_RS232::ThreadFn , ( void* )this , NULL , NULL ) ;

        DWORD dwWait = WaitForSingleObject( m_hThreadStarted , INFINITE ) ;
    
        CloseAndClearHandle( m_hThreadStarted ) ;
        m_bIsConnection = TRUE ;
    }catch(...)
    {
    
        hr = E_FAIL ;
    }
    return hr ;
}
BOOL CDll_RS232::IsConnection( ) 
{
    return m_bIsConnection ;
}
HRESULT            CDll_RS232::UnInit( ) 
{
    HRESULT hr = S_OK ;
    try{
        m_bIsConnection = FALSE;
        //SignalObjectAndWait( m_hTerminate , m_hThread , INFINITE , FALSE ) ;
        
        BOOL bRet = SetEvent( m_hTerminate ) ;
        if ( !bRet ){
            ATLTRACE( "Set Event Terninate failed\r\n" ) ;
        
        }
        DWORD dwWait = WaitForSingleObject( m_hThread , INFINITE ) ;
    
        CloseAndClearHandle( m_hTerminate );
        CloseAndClearHandle( m_hThread);
        CloseAndClearHandle( m_hCommPort );
    }catch(...){
    
        hr = E_FAIL ;
    }
    return hr ;
}

unsigned __stdcall CDll_RS232::ThreadFn( void *lpParam ) 
{
    return ( ( CDll_RS232* )lpParam )->ThreadFunction() ;
}
unsigned CDll_RS232::ThreadFunction( ) 
{
    DWORD dwEventMask = 0 , dwWait ;
    BOOL    bContinue = TRUE ;
    OVERLAPPED ov ;
    memset( &ov , 0 , sizeof( ov ) ) ;
    ov.hEvent = CreateEvent( NULL , TRUE , NULL , NULL ) ;

    HANDLE arHandles[ 2 ] = { m_hTerminate , ov.hEvent } ;
    
    SetEvent( m_hThreadStarted ) ;
    while( bContinue ) 
    {
        BOOL bRet = WaitCommEvent( m_hCommPort , &dwEventMask , &ov ) ;

        if ( !bRet ){
        return E_FAIL ;
        }

        dwWait = WaitForMultipleObjects ( 2 , arHandles , FALSE , INFINITE ) ;
        switch( dwWait ){
        case WAIT_OBJECT_0 :
            ATLTRACE( "RS232 thread terminate\r\n" ) ;
            _endthreadex( 1 ) ;
            break ;
        case WAIT_OBJECT_0 + 1 :
            {
                try{
                    OVERLAPPED ovRead ;
                    memset( &ovRead , 0 , sizeof( ovRead ) ) ;
                    ovRead.hEvent = CreateEvent( NULL , TRUE , NULL , NULL ) ;
                    COMSTAT cs ; 
                    memset( &cs , 0 , sizeof( cs ) ) ;
                    DWORD dwError ; 
                    if ( !ClearCommError( m_hCommPort , &dwError , &cs ) ){
                        throw ;
                    }
                    DWORD dwReadAvailable = cs.cbInQue , dwRead ;
                    if ( !dwReadAvailable ) {
                        CloseHandle( ovRead.hEvent ) ;
                        continue ;
                    }
                    CAtlArray<BYTE> buf ;
                    buf.SetCount( dwReadAvailable ) ;
                    BOOL bOk = ReadFile( m_hCommPort , buf.GetData() , dwReadAvailable , &dwRead , &ovRead ) ;
                    if ( !bOk ){
                        if ( GetLastError() == ERROR_IO_PENDING ){
                            dwWait = WaitForSingleObject( ovRead.hEvent , INFINITE ) ;
                            
                        }else{
                            CloseHandle( ovRead.hEvent ) ;
                            continue ;
                        }
                    }
                    LockBuffer() ;
                    m_arBuffer.Append( buf ) ;
/*#ifdef _DEBUG
                    char _dbg[ 1024 ] ;
                    sprintf( _dbg , "Receive bytes : " ) ;
                    for ( int i = 0 ; i < buf.GetCount() ; i++ ) 
                        sprintf( _dbg , "%s %02X" , _dbg , buf[ i ] ) ;
                    sprintf( _dbg , "%s Tick = %d\r\n" , _dbg , GetTickCount( ) ) ;
                    ATLTRACE( _dbg ) ;
#endif*/
                    UnLockBuffer ( ) ;
                    
                    m_SignalDataReceive ( ) ;
                    
                    CloseHandle( ovRead.hEvent ) ;
                    ResetEvent( ov.hEvent ) ;
                }catch(...){
                    return E_FAIL ;
                }
            break ;
            }
        }
    }
    return 1 ;
}
HRESULT CDll_RS232::WriteBuffer( CAtlArray<BYTE> &buffer ) 
{
    HRESULT hr = S_OK ;
    
    if ( !m_bIsConnection ) return E_FAIL ;

    OVERLAPPED ov ;
    memset( &ov , 0 , sizeof( ov ) ) ;
    ov.hEvent = CreateEvent( NULL , TRUE , NULL , NULL ) ;
    DWORD dwWrite ;
    BOOL bRet = WriteFile( m_hCommPort , buffer.GetData() , ( DWORD )buffer.GetCount() , &dwWrite , &ov ) ;
    if ( !bRet ){
        if ( GetLastError() == ERROR_IO_PENDING ){
            DWORD dwWait = WaitForSingleObject( ov.hEvent , INFINITE ) ;
    
        }else{
        return E_FAIL  ;
            hr = E_FAIL ;
        }
    }
    CloseHandle( ov.hEvent ) ;
    return hr ;
}
BOOL CDll_RS232::WriteBuffer( LPBYTE lpBuffer , DWORD dwSize ) 
{
    HRESULT ret = TRUE ;
    
    if ( !m_bIsConnection ) return E_FAIL ;

    OVERLAPPED ov ;
    memset( &ov , 0 , sizeof( ov ) ) ;
    ov.hEvent = CreateEvent( NULL , TRUE , NULL , NULL ) ;
    DWORD dwWrite ;
    BOOL bRet = WriteFile( m_hCommPort , lpBuffer , dwSize , &dwWrite , &ov ) ;
    if ( !bRet ){
        if ( GetLastError() == ERROR_IO_PENDING ){
            DWORD dwWait = WaitForSingleObject( ov.hEvent , INFINITE ) ;
        
        }else{
    
            ret = FALSE ;
        }
    }
    CloseHandle( ov.hEvent ) ;
    return ret ;
}
HRESULT CDll_RS232::ReadBuffer( CAtlArray<BYTE> &buffer ) 
{
    HRESULT hr = S_OK ;
    
    if ( !m_bIsConnection ) return E_FAIL ;

    OVERLAPPED ov ;
    memset( &ov , 0 , sizeof( ov ) ) ;
    ov.hEvent = CreateEvent( NULL , TRUE , NULL , NULL ) ;
    DWORD dwRead , dwError ;
    COMSTAT cs ;
    memset( &cs , 0 , sizeof( cs ) ) ;
    
    if ( !ClearCommError( m_hCommPort , &dwError , &cs ) ){

        ATLTRACE( "Get count available bytes failed\r\n" ) ;
        return E_FAIL ;
    }

    if ( cs.cbInQue == 0 ) {
        CloseHandle( ov.hEvent ) ;
        return S_OK ;
    }
    bool ok = buffer.SetCount( cs.cbInQue ) ;

    
    BOOL bRet = ReadFile( m_hCommPort , buffer.GetData() , ( DWORD )buffer.GetCount() , &dwRead , &ov ) ;
    if ( !bRet ){
        if ( GetLastError() == ERROR_IO_PENDING ){
            DWORD dwWait = WaitForSingleObject( ov.hEvent , INFINITE ) ;
        
        }else{
    
            hr = E_FAIL ;
        }
    }
    CloseHandle( ov.hEvent ) ;
    return hr ;
}
CAtlArray<BYTE>&    CDll_RS232::GetBuffer( ) 
{
    return m_arBuffer ;
}


h-file:

Код

#ifdef DLL_RS232_EXPORTS
#define DLL_RS232_API __declspec(dllexport)
#else
#define DLL_RS232_API __declspec(dllimport)
#endif

#define CMacroString ATL::CStringT< char, StrTraitATL< char > >

class DLL_RS232_API CDll_RS232 {
    BOOL    m_bIsConnection ;
    CRITICAL_SECTION    m_csBuffer ; // Критическая секция памяти для буфера , так как паралельно к ней будет
    // еще обращаться и программа, принимающая байты
    HANDLE    m_hTerminate ; // Событие для завершения нити
    HANDLE    m_hThread ;        // Событие о том , что нить завершена
    HANDLE    m_hThreadStarted ; // Событие о том, что нить запущена 
    HANDLE                m_hCommPort ;
    CAtlArray<BYTE>            m_arBuffer ;
private:
    //Основная нить для приема байтов с ком порта
    static unsigned __stdcall ThreadFn( void *lpParam ) ;
    //Локальная функция нити
    unsigned ThreadFunction( ) ;
protected:
    void    InvalidateHandle( HANDLE &h ) ;
    void    CloseAndClearHandle( HANDLE &h ) ;
protected:
    void                InitLock( ) { InitializeCriticalSection( &m_csBuffer ) ; };
    void                DelLock( ) { DeleteCriticalSection( &m_csBuffer ) ; };
public:
    //Лочим и разлочиваем буфер
    void                LockBuffer( ){ EnterCriticalSection( &m_csBuffer ) ; } ;
    void                UnLockBuffer( ) { LeaveCriticalSection( &m_csBuffer ) ; };
protected:
    CAtlArray<BYTE>&    GetBuffer( ) ;
public:
    CDll_RS232( void ) ;
    ~CDll_RS232( void ) ;
    void    (*m_SignalDataReceive)( ) ;

    HRESULT            Init(
        CMacroString PortName = _T("COM1"), 
        DWORD dwBaudRate = 115200 , 
        BYTE byParity = 0 , 
        BYTE byStopBits = 1 , 
        BYTE byByteSize  = 8 );
    HRESULT            UnInit( ) ;

    BOOL IsConnection( ) ;
    HRESULT WriteBuffer( CAtlArray<BYTE> &buffer ) ;
    BOOL WriteBuffer( LPBYTE lpBuffer , DWORD dwSize ) ;
    HRESULT ReadBuffer( CAtlArray<BYTE> &buffer ) ;
};



PM MAIL   Вверх
Dem_max
Дата 12.1.2012, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 16
Всего: 39



Так HRESULT  CDll_RS232::Init() так это функция класса, как она экспортируется то ?


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Lepton
Дата 12.1.2012, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А что надо написать? smile 
PM MAIL   Вверх
Dem_max
Дата 12.1.2012, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 16
Всего: 39



как то так
Код

__declspec(dllexport) HRESULT  Init()
{
...................
}


Добавлено через 1 минуту и 42 секунды
Лучше так

Код

__declspec(dllexport) HRESULT  __stdcall Init()
{
...................
}



Это сообщение отредактировал(а) Dem_max - 12.1.2012, 11:28


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Lepton
Дата 12.1.2012, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не выходит ((

Код

#include <iostream>
#include <stdio.h>
#include "stdafx.h"
#include <windows.h>

#define CMacroString ATL::CStringT< char, StrTraitATL< char > >

using namespace std; 


__declspec(dllexport) HRESULT Init( CMacroString, DWORD, BYTE , BYTE , BYTE  );
typedef __declspec(dllexport) HRESULT (*INIT)( CMacroString, DWORD, BYTE , BYTE , BYTE  );
 
void main()
{

INIT   pfnMyFunc;   //указатель на  Init
HINSTANCE hMyDll = LoadLibrary(_T("dll_rs232.dll"));
if(hMyDll != NULL)

{   //Определяем адрес функции
   pfnMyFunc= (INIT)GetProcAddress(hMyDll, "Init");

   if(pfnMyFunc== 0)   
   {
      FreeLibrary(hMyDll);
 
   }

    system ("pause");
    return;    
}


PM MAIL   Вверх
Dem_max
Дата 12.1.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 16
Всего: 39



Цитата

__declspec(dllexport) HRESULT Init( CMacroString, DWORD, BYTE , BYTE , BYTE  );
typedef __declspec(dllexport) HRESULT (*INIT)( CMacroString, DWORD, BYTE , BYTE , BYTE  );

Вот этим ты сейчас пытаешься экспортировать функции из EXE, вопрос зачем ??? когда тебе нужно экспортировать из DLL


в EXE писать
Код

typedef HRESULT   (__stdcall  *MyFunc)  (CMacroString, DWORD, BYTE, BYTE, BYTE);

MyFunc   pfnMyFunc = NULL;



Добавлено через 2 минуты и 23 секунды
Код

pfnMyFunc = (MyFunc)GetProcAddress(hMyDll, "Init");



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Lepton
Дата 12.1.2012, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Написал так

Код

#include <iostream>
#include <stdio.h>
#include "stdafx.h"
#include <windows.h>

#define CMacroString ATL::CStringT< char, StrTraitATL< char > >

using namespace std; 


typedef HRESULT (__stdcall *MyFunc)( CMacroString, DWORD, BYTE , BYTE , BYTE  );

 
void main()
{

MyFunc   pfnMyFunc = NULL; 
HINSTANCE hMyDll = LoadLibrary(_T("dll_rs232.dll"));
if(hMyDll != NULL)

{   //Определяем адрес функции
   pfnMyFunc= (MyFunc)GetProcAddress(hMyDll, "Init");

   if(pfnMyFunc== 0)
    
   {
      FreeLibrary(hMyDll);
 
   }

      HRESULT result = pfnMyFunc (_T("COM1"), 115200, 0, 1, 8); 
      FreeLibrary(hMyDll);
 

    system ("pause");
    return;    

}
}


 На этапе

Код

  HRESULT result = pfnMyFunc (_T("COM1"), 115200, 0, 1, 8); 


 Возникает ошибка

Код


Необработанное исключение в "0x00000000" в "COM_IK.exe": "0xC0000005": Acces violation. 

PM MAIL   Вверх
Dem_max
Дата 12.1.2012, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 16
Всего: 39



патамушта нужно везде (ВЕЗДЕ !!!) заменить  CMacroString на char * или лучше на PTCHAR ( и не забыть подключить tchar.h)

Код

typedef HRESULT (__stdcall *MyFunc)( char *, DWORD, BYTE , BYTE , BYTE  );


Это сообщение отредактировал(а) Dem_max - 12.1.2012, 12:20


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Lepton
Дата 12.1.2012, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все сделал. Не получается ((
PM MAIL   Вверх
Dem_max
Дата 12.1.2012, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 16
Всего: 39



надеюсь Init()  у тебя не функция класса ????


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Lepton
Дата 12.1.2012, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Init()  функция класса
PM MAIL   Вверх
xvr
Дата 12.1.2012, 13:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(Lepton @  12.1.2012,  12:08 Найти цитируемый пост)
Написал так

Код

   //Определяем адрес функции
   pfnMyFunc= (MyFunc)GetProcAddress(hMyDll, "Init");
   if(pfnMyFunc== 0)
    
   {
      FreeLibrary(hMyDll);
 
   }
      HRESULT result = pfnMyFunc (_T("COM1"), 115200, 0, 1, 8); 
      FreeLibrary(hMyDll);

 

Оригинально! Т.е. если не смогли взять адрес в pfnMyFunc, то выгружаем dll, а потом все равно зовем функцию (теперь уже по 0 адресу)  smile 

Цитата(Lepton @  12.1.2012,  12:43 Найти цитируемый пост)
Init()  функция класса 

Выноси ее из класса. Потом приходи снова - будем учиться отключать С++ манглинг имен, пресекать попытки передавать С++ классы через границы dll (да и еще by-value), ну и еще что нибудь  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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