powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нужна помощь в создании dll.
10 сообщений из 10, страница 1 из 1
Нужна помощь в создании dll.
    #32800530
NightGhost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все работает нормально для функций не возвращающих параметр
//------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
Нужна помощь в создании dll.
    #32800531
NightGhost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так не работает
вставляю вместо char* void
все работает
...
Рейтинг: 0 / 0
Нужна помощь в создании dll.
    #32800670
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
А far char*
или LPVOID?
или возвращай значение в параметр :)
f(char *szParam, char *szResult);
...
Рейтинг: 0 / 0
Нужна помощь в создании dll.
    #32800802
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
//------App.h--------------------------
typedef char * (__stdcall *func1)(char*);
HMODULE lib;
func1 MMessage;

А может проблема как раз в том, что ты в своей программе переопределяешь char*?
...
Рейтинг: 0 / 0
Нужна помощь в создании dll.
    #32802277
NightGhost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что значит переопределяю
не особо это понимаю
программа простейшая
конечно можно использовать и как процедуру
но все таки странно как то
...
Рейтинг: 0 / 0
Нужна помощь в создании dll.
    #32802283
NightGhost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
//------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
Нужна помощь в создании dll.
    #32802453
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Нужна помощь в создании dll.
    #32803556
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про фары забудьде, все уже, нету фаров. А есть единое виртуальное адресное пространство задачи.

А что у тебя char* не возвращается, так скорее всего ты возвращаешь указатель на данные, которые действительны только внутри твоей функции в твоей DLL. Например, на автоматический массив.
...
Рейтинг: 0 / 0
Нужна помощь в создании dll.
    #32803832
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Нужна помощь в создании dll.
    #32806708
NightGhost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо
у меня все заработало после того как я в dll.cpp
функцию переобозвал
__declspec( dllexport ) char * Code_Dec(char *s)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нужна помощь в создании dll.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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