import funkcji z DLL

import funkcji z DLL
JM
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 lat
  • Postów:108
0

mam bibliotekę inpout32.dll i chcę z niej wytargać do programu funkcję
void Out32(short adres, char wartosc);

Poszperałem, i znalazłem coś na styl:

Kopiuj
[DllImport("inpout32.dll", EntryPoint="Out32",
CharSet=CharSet.Auto)]
static extern void Out32(short adres, char wartosc);

Nie wierzyłem, że kompilator mi przepuści takiego stwora, i się nie pomyliłem.

Więc pytanko: Jak to ma być?


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
KD
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 12 lat
0

A my wróżki jesteśmy czy co? jakie błędy Ci wywala kompilator? i czemu jest to w dziale C/C++ jak ewidentnie widać, że to kod Managed? Funkcje w bibliotece musisz exportować jako C a nie C++.

extern "C"

JM
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 lat
  • Postów:108
0

No, no! Widzę, że dziś się zarejestrowałeś na forum, i od razu rządzisz? Takie teksty... :>

  1. extern "C" piszemy, gdy biblioteka jest napisana w innym języku, niż C++. Skąd wiesz, że jest?
  2. Błąd typowy (w Turbo) dla tak dziwnych zapisów: Declaration terminated incorrectly

#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
KD
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 12 lat
0

extern "C" piszemy dlatego, że w C++ do nazwy funkcji dołączane są różne informacje na temat jej parametrów, dzięki temu możliwe jest przeładowywanie funkcji. Dlatego przy eksportowaniu funkcji trzeba robić extern "C" bo inaczej nazwa funkcji wyglądała by w deseń: fnMy444@@YAHXZ i takie coś musiałbyś importować... Najpierw poczytaj, później pisz :)

JM
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 lat
  • Postów:108
0

Dobrze wiem, po co to jest. Ale jeżeli tak program, jak i biblioteka jest pisana w C++, to nie trzeba robić takich modyfikacji. Z resztą - nie o tym jest temat.


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
KD
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 12 lat
0

Trzeba, bo nie ma znaczenia tu w czym jest biblioteka napisana, może być napisana w C, C++, D, VB, Delphi - nie ma znaczenia, musi być zrobiona tak, żeby program zewnętrzny mógł wyciągnąć z niej odpowiednią funkcję podając jej nazwę i można to zrobić (w C/C++) albo pisząc extern "C", albo dodając plik .def i tam umieścić odpowiedni export. Przed napisaniem poprzedniego posta sprawdziłem to dokładnie.

I tu prawdopodobnie jest Twój błąd, że .NET nie może znaleźć odpowiedniej funkcji w DLL'ce.

JM
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 lat
  • Postów:108
0

Gdyby nie mugł znaleźć, to wysypałby się w czasie działania. A on się nie kompiluje!


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
KD
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 12 lat
0

Pokaż błąd, bo to może być cokolwiek. Kod jest poprawny, w każdym razie ten który pokazałeś.
U mnie sam ten kod przechodzi bez problemu.

JM
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 lat
  • Postów:108
0

Czytaj mój drugi post w temacie


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
KD
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 12 lat
0

Taki kod:

Kopiuj
[DllImport ("444.dll", EntryPoint = "fnMy444", CharSet = CharSet.Auto)]
public static extern int fnMy444();

public Form1 ()
{
	InitializeComponent ();

	int t = fnMy444 ();
}

Kompiluje się i działa baz zarzutów. Błędu musisz szukać w innym fragmencie kodu.

JM
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 lat
  • Postów:108
0

Dziwne, bo w helpie mam tak:

Kopiuj
#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
// for DllImportAttribute

namespace SysWin32
{
   [DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]
   int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption,
				  unsigned int uType);
}

int main( )
{
   SysWin32::MessageBox( 0, L"Hello world!", L"Greetings", 0 );
}

A wypisuje mi, że nie zna dyrektywy using


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
KD
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 12 lat
0

Heh ciekawe :)

Taki kod:

Kopiuj
// 441.cpp : main project file.

#include "stdafx.h"
#include "Form1.h"

using namespace My441;

using namespace System::Runtime::InteropServices;
// for DllImportAttribute

namespace SysWin32
{
	[DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = CharSet::Unicode)]
   int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption,
                                  unsigned int uType);
}

int main( )
{
   SysWin32::MessageBox( 0, L"Hello world!", L"Greetings", 0 );
}

kompiluje się i działa bez problemu. Jedyne co musiałem zmienić to dodać Charset:: przed Unicode

Visual C++ 2008 Express

quetzalcoatl
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 6 lat
0
JaskMar napisał(a)

2. Błąd typowy (w Turbo) dla tak dziwnych zapisów: Declaration terminated incorrectly

JaskMar napisał(a)

Dziwne, bo w helpie mam tak:

Kopiuj
#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
// for DllImportAttribute

namespace SysWin32
{
   [DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]

blad z Turbo, a help i przyklad rodem z Visuala i .Net'a? troche dziwne, JaskMar.. i wcale bym sie nie zdziwil gdyby Twoj Turbo nie znał #using-DLLka. to nie jest C++. to jest rozszerzenie wprowadzone przezm Microsoft, specjalnie na potrzeby .Net'a


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał
JM
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 lat
  • Postów:108
0

Ja to znalazłem w Turbo!

A to też jest typowe dla Visuala:

Kopiuj
[DllImport("inpout32.dll", EntryPoint="Out32",
CharSet=CharSet.Auto)]
static extern void Out32(short adres, char wartosc);

???????????


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
quetzalcoatl
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 6 lat
0

hm.. borlanturboc++ obsluguje c++/cli? fiu.. niespodziewalem sie, ok nie wtracam sie :)


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał
JM
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 lat
  • Postów:108
0

Noo super... Tobie obsługuje, a mi się rzuca...
Będę płakał.

Ale nic - robie to funkcją LoadLiblery


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
quetzalcoatl
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 6 lat
0

nie powiedzialem ze mi obsluguje. zdziwilem sie ze znalazles tako kod w helpie do BTC++. to ze on tam jest sugeruje ze on to obsluguje. nic ponad to nie powiedzialem..
..chusteczke?:)


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał
JM
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 lat
  • Postów:108
0

Nie, mam swoją. Ale dzięki...


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.