Skocz do zawartości

Jedno Maleńkie Pytanko DLL


KozakPL

Rekomendowane odpowiedzi

Siema xD Tęskniliście? xD Mam pytanko.Piszę takiego MiniDLL'ka i mam problem:

 

oto kod:

#include<windows.h>
#include"main.h"

#define export extern "C" __declspec(dllexport)

export char* Tworz( char* Sciezka)
{
    CreateFile( Sciezka, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}

 

i tradycyjnie błąd:

main.c||undefined reference to `WinMain@16'|
||=== Build finished: 1 errors, 0 warnings ===|

Odnośnik do komentarza
Udostępnij na innych stronach

zmień opcje kompilacji z aplikacji (EXE) na biblioteke dynamiczną (DLL) -.-

extern "C" __declspec(dllexport)

pamiętaj, nie sugeruj się tym, że ta linijka zrobi to za Ciebie, bo to jest zwykłe dodanie nazwy funkcji do tablicy exportu, po to aby z zewnątrz można było pobrać wskaźnik na funkcję.

 

Swoją drogą, zlituj się nad nami i przeczytaj to:

http://darkcult.gamedev.pl/kursy/apidll.html

Odnośnik do komentarza
Udostępnij na innych stronach

aaaaaaaa no tak...na początku się wybiera...dziex Psysiu :)

 

EDIT:

Jeszcze 1 pytanko xD

 

czemu wylatuje błąd?

GML
T = external_define( 'TworzDLL.dll', 'Tworz', dll_stdcall, ty_string, 1, ty_string);

external_call( T, "C:\Documents and Settings\Skovv\Pulpit\dupa.txt" );

external_free( 'TworzDLL.dll' );

 

i błąd w okienku windowa:

Unexpected error occured when running the game

 

Coś z dllem czy gml?

Odnośnik do komentarza
Udostępnij na innych stronach

Zamiast "\" pisz "/" lub "\\" bo ten znak pojedynczo oznacza znak specjalny do interpretowania z następna literą np "\n" oznacza nową linie. Rozumiesz?

Odnośnik do komentarza
Udostępnij na innych stronach

rozumiem ;p Dziex :)

 

E: Ale nadal nie działa ;/

GML
T = external_define( 'TworzDLL.dll', 'Tworz', dll_stdcall, ty_string, 1, ty_string);

external_call( T, "C:/Documents and Settings/Skovv/Pulpit/dupa.txt" );

external_free( 'TworzDLL.dll' );

Odnośnik do komentarza
Udostępnij na innych stronach

Na sucho nic nie pomogę. Podeslij mi projekt źródła dlla i gm na pm a jutro rano Ci naprawie bo teraz jestem na fonie. Swoją drogą ściągnij sobie visual c++ i odpalaj dllke debugowana i powinno wywalic jaki błąd. Ale i tak w sumie nie będziesz wiedział co z tym zrobić więc najwyżej podasz tutaj treść błędu. Albo jak mówiłem, podeslij mi pliki a jutro pomogę

 

EDIT:

 

Masz wać swoje kody:

 

#include <stdio.h>

#define export extern "C" __declspec(dllexport)

export double Kwadrat(double liczba)
{
return liczba*liczba;
}

export double Tworz( char* Sciezka) // nie zwracaj cholernego char* jesli nie ma takiej koniecznosci, bo z nim GM ma problemy, swoja droga funkcja powinna ZAWSZE cos zwracac a twoja nic nie zwracala.
{
    // mozna prosciej i bez bledow, po wiecej zapraszam tu: http://www.cplusplus.com/reference/clibrary/cstdio/fopen/
    FILE* file; // wskaznik na obiekt pliku
    file=fopen(Sciezka,"w"); // fopen otwiera plik o nazwie Sciezka, w trybie zapisu ("w"), a jesli taki plik nie istnieje to zostaje utworzony. funkcja zwraca wskaznik na obiekt pliku.
    if(file==NULL)return(false); // jesli zwrocony wskaznik bedzie rowny NULL to znaczy ze nie otworzyl / utworzyl pliku i konczy funkcje zwracajac false
    fclose(file); // po utworzeniu pliku musimy z niego wyjsc
    return(true); // zwracamy true poniewaz utworzenie pliku powiodlo sie
}

// i najwazniejsze:
// OLEJ DEVC++ JAK NAJSZYBCIEJ I PRZERZUC SIE NA INNE LEPSZE IDE,
// KTORE POZWOLI CI PORZADNIE DEBUGOWAC PROJEKT,
// INACZEJ BEDA PROBLEMY ZE ZNALEZENIEM PRZYCZYNY BLEDU.
// NAJLEPIEJ WYBIERZ VISUAL C++, SKORO I TAK PISZESZ TYLKO POD WINDOWS

 

GML
zTworz = external_define( 'Kozak.dll', 'Tworz', dll_stdcall, ty_real, 1, ty_string ) // zwracamy real a nie string, bo na jaka cholere byl ci potrzebny to nie wiadomo

Sciezka = "lol.txt"

external_call( zTworz, Sciezka )

external_free( 'Kozak.dll' )

Odnośnik do komentarza
Udostępnij na innych stronach

Odpowiednikiem real jest double, a string jest char*. Gdy zwracasz liczbę to jako double, a nie char*. Inaczej było by to nie logiczne. I nawet napisałem w komentarzu czemu tak. Tylko mi nie mów że nie czytałes...

Odnośnik do komentarza
Udostępnij na innych stronach

czytałem...ale nadal nie rozumiem ;/ Przecież Sciezka to będzie string bo "lol.txt" a nie np: 5 ;/

 

w arcie jest np tak:

export char* GMText( void )

czyli to przez to ze nie ma żadnej funkcji?Jak by było np zamiast void "char* lol" to wtedy było by tak:

export double GMText( char* lol )

?

Odnośnik do komentarza
Udostępnij na innych stronach

O kurfa :0 double jest bo zwraca liczbę a nie tekst

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...