import funkcji z DLL

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:

[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ć?

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"

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
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 :)

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.

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.

0

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

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.

0

Czytaj mój drugi post w temacie

0

Taki kod:

[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.

0

Dziwne, bo w helpie mam tak:

#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

0

Heh ciekawe :)

Taki kod:

// 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

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:

#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

0

Ja to znalazłem w Turbo!

A to też jest typowe dla Visuala:

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

???????????

0

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

0

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

Ale nic - robie to funkcją LoadLiblery

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?:)

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1