dll i _funkcja()

0

Próbuje stworzyć bibliotekę która będzie zawierać funkcję UserInstruction().
Bibliotekę tworzę za pomocą Borland turbo c++.
Plik dll powstaje ale funkcja funkcja nazywa się "_UserInstruction()"
Jak się pozbyć tego podkreślenia.
Funkcja ma być wywołana przez zewnętrzny program który ma na sztywno przypisane UserInstruction.
Inne kompilatory robią to dobrze m.in devcpp code::block itp.

POMOCY

0

zainteresuj sie tym:

extern "C" {
 ..
}
0

Wyłącz to:
Project->Options->C++ Compiler->Output->Generate underscores on symbol names (-u)

Z tym ze z doswiadczenia wiem, ze wylaczenie tego powoduje czesto spore problemy. Jezeli uzywasz VCL i to wylaczysz to prawdopodobnie projekt ci sie w ogole nie skompiluje.

extern "C" wylacza borlandowskie kluczowanie nazw - powinienes go uzyc, jezeli dll ma byc wykorzystywany z kompilatorem innym niz Borlanda

0

Sprobuje wyłączyć tą funkcję Project->Options->C++ Compiler->Output->Generate underscores on symbol names (-u).
Może to pomoże, bo już używam extern "C" a kompilator i tak nazywa moją funkcję _UserInstruction().
Najgorsze jest to, że program który ma korzystać z dll'a potrafi wywołać tylko UserInstruction().

Dziękuje za podpowiedz. Jak przetestuje to dam znać czy pomogło.

0

uzywaz extern C i on dalej dokleja podkreslniki??? rrany.. przeciez extern C wyraznie nakazuje wylaczyc wszelki mangling nazw i uzywac "czystych nazw" wlasnie po to, aby mozna bylo dokaldnie zdefiniowac nazwe eksportu.. i to nie tylko borlandowskie tak maja - mangling jest stosowany w kazdym kompilatorze C++.. nieznam sie akurat na borlandzie, ale jesli jest taka opcja jak ethello pisze i jesli przez nia nie bezdie Ci sie kompilwoalo (bo np. pozmienia jakies nazwy bardzo waznych funkcji), to jesli jest to mozliwe to uzyj jej ale TYLKO na module .cpp ktory ma te konkretna funkcje, na reszcie projektu zostaw - wtedy caly projekt bedzie objety podkreslnikowaniem, ale ta jedna funkcja/modul - nie, moze wtedy sie uda..

0

zadeklaruj funkcję w konwencji _stdcall :)

0

quetzalcoatl: borland zawsze dokleja podkreslenia na poczatku. extern "C" daje tylko to, ze nazwa jest "czysta" (w konwencji C), ale podkreslenie na poczatku zostanie.

Wymusic nie stosowanie podkreslenia mozna tylko wylaczajac ta opcje, ale wtedy moga pojawic sie Linker Errory, bo linkowanie z VCL sie nie powiedzie. Opcję tą ustawia się dla całego projektu.

Tym nie mniej, jezeli projekt nie uzywa VCL, a jest robiony tylko w czystym C++ to powinno zadzialac. Co do _stdcall to byc moze tez jest wyjscie - nie wiem bo nie probowalem.

0

Taki kod dał pożądany rezultat.
Dziękuje bardzo za pomoc.
Ale mam jeszcze jedno pytanko, dlaczego w momencie wywołania Form1 program (całkowicie zewnętrzna aplikacja) zgłasza mi błąd (powiadom autorów o błędzie itp).
Wydaje mi się, że ten program nie powinien zgłaszać błędów bo ja tylko wywołuję funkcję UserInstruction ale nic z nią nie robię.

extern  "C" __declspec(dllexport)__stdcall BOOL UserInstruction
		(
		HWND hWnd,
		HINSTANCE hInst,
		double *nArray,
		LPSTR lpData1,
		LPSTR lpData2)
	{
		int x = 5;

		//MessageBoxA(NULL, "Test", "Tesr", 0);

		Form1->Show();

		return 1;
	}
0
othello napisał(a)

Wymusic nie stosowanie podkreslenia mozna tylko wylaczajac ta opcje, ale wtedy moga pojawic sie Linker Errory, bo linkowanie z VCL sie nie powiedzie. Opcję tą ustawia się dla całego projektu.

O ile dobrze pamiętam, da się usunąć te podkreślenia robiąc odpowiedni plik DEF dla projektu dll'ki.

Coś w tym stylu

EXPORTS 
   UserInstruction=_UserInstruction
   ...
0

hm.. no tak, rzeczywiscie, najprosciej zmeinic mapowanie eksportow.. ale - czy aby def'y nie sa przypadkiem re-generowane przy kazdej kompilacji na podstawie zrodel..?

0

Może i są jak się coś wypstryka w opcjach ;) W każdym razie kiedyś robiłem dll'ke w ten sposób i było OK.

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