Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Проблем с DLL


Автор: stic 26.7.2006, 13:50
Здравствуйте.
У меня проблемы при создании dll в Visual Studio .Net ( создание: VC++ Win32 project а Application settings - DLL ). 


Код

//XDll.cpp
#include "stdafx.h"
#include "XDll.h"
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    return TRUE;
}
__declspec(dllexport) int getSum( int n1, int n2)
{
    return n1 + n2;




Код

//XDll.h
extern "C" __declspec(dllexport) int getSum(int n1, int n2);



DLL делаю для MS EXCEL (VBA) – так поставлена задача. Через Tool а References… не подключается. Через объявление:

Код

Private Declare Function getSum Lib "C:\Excel\XDll.dll" (ByVal x As Integer, ByVal y As Integer) As Integer
-------------------------------------------------------------------------------------------------------
Private Sub CommandButton1_Click()
    Lab1.Caption = getSum(CInt(TextBox1.Text), CInt(TextBox2.Text)) 
‘тут выдает ошибку «Run-time error ’49’: Bad DLL calling convention»
End Sub


Это мой первый эксперимент с dll.  Подскажите где протупил smile Может есть еще какой-то способ создания dll на VC++ (в Visual Studio) и подключить ее в проект VBA? 
Заранее спасибо за ответы.

Добавлено @ 13:53 
Бьюсь над этой проблеммой не один день  smile  smile  smile  smile  smile  smile  smile   

Автор: dumb 26.7.2006, 15:12
__stdcall в объявление экспортируемой функции добавь 

Автор: bel_nikita 26.7.2006, 15:17
в младших версиях VC для DLL нужен .def - файл с описанием экпортируеымх функций 

Автор: stic 28.7.2006, 10:07
Все таки создал DLL  на C++ Builder 6.0, а так же и тестовое приложение к нему тоже на C++ Builder 6.0. DLL работает. Начал подключать к MS Excel через:
Private Declare Function Message Lib " C:\Project\mydll.dll " (x As Long, y As Long) As Long

Возникает ошибка:
Can’t find DLL entry point Message in C:\Project\mydll.dll

Может в функцию DllEntryPoint (точка входа в DLL) нужно добавить чета. 

Код

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}


Я пробовал и оптимизацию с VC++:

Код

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
        return 1;
}


Посоветуйте решение. 
Заранее спасибо за ответы.

Модератор: научись, наконец, пользоваться оформлением
  

Автор: bel_nikita 28.7.2006, 11:03
случайно MFC не используешь? 

Автор: stic 28.7.2006, 11:34
Нет, с MFC не работаю. А он может мне как-то помоч в решении проблеммы? 

Автор: GremlinProg 28.7.2006, 22:49
попробуй добавить к DllMain extern "C"
Код

extern "C"
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved){
}


Добавлено @ 22:52 
или просто extern, не знаю точно, какой синтаксис нужен для экспорта в VBA, попробуй оба варианта 

Автор: np9mi7 28.7.2006, 22:58
Цитата
Все таки создал DLL  на C++ Builder 6.0, а так же и тестовое приложение к нему тоже на C++ Builder 6.0. DLL работает. Начал подключать к MS Excel через:
Private Declare Function Message Lib " C:\Project\mydll.dll " (x As Long, y As Long) As Long
Builder собирает dll в OMF формате, может от этого и возникают проблемы;

Для нормальной работой в VB создай *.def для превдонимов имен функций и обязательно для всех функций используй __stdcall соглашение о вызове; 

Автор: Damarus 29.7.2006, 00:25
Цитата(np9mi7 @  28.7.2006,  23:58 Найти цитируемый пост)
Builder собирает dll в OMF формате, может от этого и возникают проблемы;

Может я чего то не понял, но мне казалось dll имеет PE формат.
 

Автор: GremlinProg 29.7.2006, 00:44
видимо np9mi7 имеет ввиду lib файлы
Цитата

LINK accepts .obj files that are either Common Object File Format (COFF) or 32-bit Object Module Format (OMF)

почти тот же COFF, только еще с дебагом до кучи. 

Автор: Mad 1.8.2006, 15:24
Цитата(stic @  26.7.2006,  12:50 Найти цитируемый пост)

__declspec(dllexport) int getSum( int n1, int n2)
{
    return n1 + n2;
}

Тут ты определяеш ее как C++ (т.е. с добавлением типов к имени)

Цитата(stic @  26.7.2006,  12:50 Найти цитируемый пост)

extern "C" __declspec(dllexport) int getSum(int n1, int n2);

[/quote]
а тут без добавления

Автор: supersonic 15.9.2006, 10:33
А может этот ексель хочет что бы длл-мэйн была экспортируемой ? Стоит глянуть на чужые длл-ки для этого экселя и посмотреть какие функ. эти длл экспортируют.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)