Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Офф-топ

Страница: 1 |

 

  Вопрос: Функция Си из VB Добавлено: 20.11.05 08:11  

Автор вопроса:  Progos | Web-сайт: html-expert.org.ru | ICQ: 311715784 
Вот DLL на Си
#include "stdafx.h"
#include "testing.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;
}


// This is an example of an exported variable
TESTING_API int nTesting=0;

// This is an example of an exported function.
TESTING_API int fnTesting(void)
{
return 42;
}
Объявляю из VB Private Declare Function fnTesting lib "testing.dll" () as long
Вызываю fnTesting
DllMain вызывает, а на fnTesting пишет не найдена точка входа.
Что не так?

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #1 Добавлено: 20.11.05 09:04
Во-первых, что за тип такой: TESTING_API?
Во-вторых, функция fnTesting должна быть _stdcall:
int _stdcall fnTesting(void)
В-третьих, проверь, экспортируется ли эта ф-ция (т.е. указана она как EXPORTS fnTesting в файле .def)

Ответить

Номер ответа: 2
Автор ответа:
 Progos



ICQ: 311715784 

Вопросов: 39
Ответов: 157
 Web-сайт: html-expert.org.ru
 Профиль | | #2
Добавлено: 20.11.05 14:18
#ifdef TESTING_EXPORTS
#define TESTING_API __declspec(dllexport)
#else
#define TESTING_API __declspec(dllimport)
#endif

_stdcall пробовал до этого - ноль эффекта

Можно подробнее об
EXPORTS fnTesting в файле .def
У меня это файла .def нет

Ответить

Номер ответа: 3
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #3 Добавлено: 20.11.05 14:58
Не знаю, чем ты там делаешь dll, я компилирую и линкую из командной строки.
Создаёшь файл testing.def, указываешь в нём имена экспортируемых ф-ций, и имя файла указывается линкеру, чтобы он знал, что включить в таблицу экспорта

.cpp:

    #include <windows.h>


//=======================================================================
int _stdcall fnTesting(void)
{
    return 42;
}

//=======================================================================
int DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;
        
        case DLL_PROCESS_DETACH:
            // detach from process
            break;
        
        case DLL_THREAD_ATTACH:
            // attach to thread
            break;
        
        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE;
}


Файл testing.def:

LIBRARY testing
EXPORTS fnTesting


Компилирую так:
cl /LD /Ox testing.cpp

Линкую с ключом /def:
link /subsystem:windows /dll /def:testing.def testing.obj

И функция нормально вызывается

Ответить

Номер ответа: 4
Автор ответа:
 Progos



ICQ: 311715784 

Вопросов: 39
Ответов: 157
 Web-сайт: html-expert.org.ru
 Профиль | | #4
Добавлено: 20.11.05 19:28
Я разобрался - надо было в начало дописать extern "C"

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам