Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нужна помощь в создании dll. / 10 сообщений из 10, страница 1 из 1
25.11.2004, 20:59
    #32800530
NightGhost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
Все работает нормально для функций не возвращающих параметр
//------Dll.h---------------------------
#define DLL_SPEC extern "C" __export
DLL_SPEC char * __stdcall Message(char *p);

//------Dll.cpp-------------------------
#define _DLLMAINCPP
#include "dllmain.h"
..
char * __stdcall Message(char* p).....
...

//------App.h--------------------------
typedef char * (__stdcall *func1)(char*);
HMODULE lib;
func1 MMessage;

//------App.cpp--------------------------
#define _APPMAINCPP
#include "dllmain.h"

...
HMODULE lib = LoadLibrary("dllmain.dll");
if(lib)
MMessage = (func1)GetProcAddress(lib, "Message");
...
...
Рейтинг: 0 / 0
25.11.2004, 21:00
    #32800531
NightGhost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
Вот так не работает
вставляю вместо char* void
все работает
...
Рейтинг: 0 / 0
26.11.2004, 07:28
    #32800670
Sie
Sie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
А far char*
или LPVOID?
или возвращай значение в параметр :)
f(char *szParam, char *szResult);
...
Рейтинг: 0 / 0
26.11.2004, 09:41
    #32800802
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
Код: plaintext
1.
2.
3.
//------App.h--------------------------
typedef char * (__stdcall *func1)(char*);
HMODULE lib;
func1 MMessage;

А может проблема как раз в том, что ты в своей программе переопределяешь char*?
...
Рейтинг: 0 / 0
26.11.2004, 20:59
    #32802277
NightGhost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
что значит переопределяю
не особо это понимаю
программа простейшая
конечно можно использовать и как процедуру
но все таки странно как то
...
Рейтинг: 0 / 0
26.11.2004, 21:08
    #32802283
NightGhost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
//------App.h--------------------------
typedef char * (__stdcall *func1)( char* );
HMODULE lib;
func1 MMessage;


все равно не получается
Текст проекта
----dll.h---------
#ifndef _abc_h
#define _abc_h
#ifdef _DLL__
#define DLL_EI __declspec(dllexport)
#else
#define DLL_EI __declspec(dllimport)
#endif

extern "C" char * DLL_EI Code_Dec(char *s);

#endif

----dll.cpp--------------
// îáðàòèòå íà ýòó ñòðî÷êó âíèìàíèå
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#define _DLLCPP
#include "dllmain.h"
#pragma argsused

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

//---------------------------------------------------------------------------
char * Code_Dec(char *s) {
for (int i = 0;; i++) {
if (s == '\0') break;
s = s ^ 'À';
}
return s;
// Application->MessageBox(p,"From DLL",IDOK);
}


---------App.h-----------
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

//---------------------------------------------------------------------------
//typedef char * (__stdcall *func1)(char*);
typedef char * (__stdcall*func1)(char*);
//---------------------------------------------------------------------------
class TForm1 : public TForm {
__published: // IDE-managed Components
TEdit *Edit1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
HINSTANCE lib;
func1 Code;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};

//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------
#endif

---------App.cpp-------
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#define _DLL__
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {

}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE lib = LoadLibrary("dllmain.dll");
if(lib)
Code = (func1)GetProcAddress(lib, "Code_Dec");
if(Code)
Edit1->Text = Code(Edit1->Text.c_str());
FreeLibrary(lib);
Code = NULL;

}
...
Рейтинг: 0 / 0
27.11.2004, 11:22
    #32802453
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
NightGhostчто значит переопределяю
не особо это понимаю
программа простейшая
конечно можно использовать и как процедуру
но все таки странно как то

Код: plaintext
typedef char * (__stdcall *func1)(char*);

Дык, вот здесь и переопределяешь: typedef <имя типа> <определение>.
В твоем случае имя типа char*, а определение
Код: plaintext
(__stdcall *func1)(char*)
. Далее, где встречается char* - подразумевается
Код: plaintext
(__stdcall *func1)(char*)

По -видимому, необходимо примерно следующее:

Код: plaintext
typedef MyRetCharFromDll char * (__stdcall *func1)(char*);
...
Рейтинг: 0 / 0
29.11.2004, 11:49
    #32803556
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
про фары забудьде, все уже, нету фаров. А есть единое виртуальное адресное пространство задачи.

А что у тебя char* не возвращается, так скорее всего ты возвращаешь указатель на данные, которые действительны только внутри твоей функции в твоей DLL. Например, на автоматический массив.
...
Рейтинг: 0 / 0
29.11.2004, 13:07
    #32803832
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
NightGhostТекст проекта
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
 ----dll.h---------
#ifndef _abc_h
#define _abc_h
#ifdef _DLL__
#define DLL_EI __declspec(dllexport)
#else
#define DLL_EI __declspec(dllimport)
#endif

extern "C" char * DLL_EI Code_Dec(char *s);

#endif

----dll.cpp--------------
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#define _DLLCPP
#include "dllmain.h"
#pragma argsused

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

//---------------------------------------------------------------------------
char * Code_Dec(char *s) {
    for (int i =  0 ;; i++) {
        if (s[i] == '\0') break;
        s[i] = s[i] ^ 'À';
    }
    return s;
}

Я бы посоветовал внести следующие изменения в функцию Code_Dec:
1. В качестве параметра использовать не char *, а const char *
2. В функции объявить переменную: char *s
3. Сделать присваивание: s=(char *)<stroka>
Т.е. функция будет выглядеть примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
char * Code_Dec(const char *stroka) {
    char *s;
    int i= 0 ;
    s=(char *)stroka;
    
    while (s[i] != '\0') 
       {
          s[i] ^= 'À';
          i++;
       }
    return s;
}
Я писал свою небольшую DLL и использовал этот прием. У меня все работает ОК!
...
Рейтинг: 0 / 0
30.11.2004, 23:20
    #32806708
NightGhost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь в создании dll.
спасибо
у меня все заработало после того как я в dll.cpp
функцию переобозвал
__declspec( dllexport ) char * Code_Dec(char *s)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нужна помощь в создании dll. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]