von autoit zu c++

03/07/2014 13:24 Terrat#1
Hallo ich versuche derzeit den autoit code:
Code:
Func _SkinGUI($SkincrafterDll, $SkincrafterSkin, $Handle)
   $Dll = DllOpen($SkincrafterDll)
   DllCall($Dll, "int:cdecl", "InitLicenKeys", "wstr", "SKINCRAFTER", "wstr", "SKINCRAFTER.COM", "wstr", "[Only registered and activated users can see links. Click Here To Register...]", "wstr", "DEMOSKINCRAFTERLICENCE")
   DllCall($Dll, "int:cdecl", "InitDecoration", "int", 1)
   DllCall($Dll, "int:cdecl", "LoadSkinFromFile", "wstr", $SkincrafterSkin)
   DllCall($Dll, "int:cdecl", "DecorateAs", "int", $Handle, "int", 25)
   DllCall($Dll, "int:cdecl", "ApplySkin")
EndFunc
in c++ zu übersetzen.
Vortschritte:
#update 1 void
#update 2 Loadlibrary
Code:
void _SkinGUI(char *SkincrafterDll, char *SkincrafterSkin, DWORD Handle)
{
    HINSTANCE SkinDLL;
    SkinDLL = LoadLibrary(TEXT("Skin.dll"));
}
03/07/2014 13:40 Tyrar#2
Als nächstes müsstest du via GetProcAddress an die Adressen der einzelnen Funktionen kommen und den Returnwert in einen Funktionspointer casten, diesen dann callen.
Ich verstehe aber nicht, warum du der Funktion überhaupt Parameter gibst die hinterher wohl eh nicht mehr verwendet werden?
03/07/2014 15:52 Terrat#3
da ich die funktion mehfrach benutzen möchte ;)

Quote:
Originally Posted by Tyrar View Post
Als nächstes müsstest du via GetProcAddress an die Adressen der einzelnen Funktionen kommen und den Returnwert in einen Funktionspointer casten, diesen dann callen.
Ich verstehe aber nicht, warum du der Funktion überhaupt Parameter gibst die hinterher wohl eh nicht mehr verwendet werden?
so oder wie ?
Code:
   PGNSI pGNSI;
   SYSTEM_INFO si;

   ZeroMemory(&si, sizeof(SYSTEM_INFO));
   
   pGNSI = (PGNSI) GetProcAddress(
       SkinDLL, 
      "InitLicenKeys");
03/07/2014 17:24 Mostey#4
Quote:
Originally Posted by Dreamsläps View Post
da ich die funktion mehfrach benutzen möchte ;)



so oder wie ?
Code:
   PGNSI pGNSI;
   SYSTEM_INFO si;

   ZeroMemory(&si, sizeof(SYSTEM_INFO));
   
   pGNSI = (PGNSI) GetProcAddress(
       SkinDLL, 
      "InitLicenKeys");
Code:
#include <functional>
std::function<int(int)> InitDecoration = reinterpret_cast<int(*)(int)>(GetProcAddress(hModule, "InitDecoration"));
Das war mit Funktionspointer gemeint. Was auch immer du da gemacht hast, kann ich nicht nachvollziehen.
03/07/2014 18:00 th0rex#5
Er wird sowas gemacht haben:
Code:
typedef rückgabewert(__stdcall *name)
		(param1_type, param2_type);
Je nachdem wie die Funktion halt aussieht. Danach halt das:
Code:
name Funktion = (name)
		GetProcAddress(GetModuleHandle("dll"),
		"Funktion");
Für mich ist das ein Funktions pointer ^^ Funktioniert auch so. Frage mich nur was das System_Info und ZeroMemory da drinnen zu suchen hat. Deins geht aber natürlich auch.
03/07/2014 18:05 Terrat#6
hab da jetzt bisher das stehen:
Code:
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

	HINSTANCE SkinDLL;
    SkinDLL = LoadLibrary(TEXT("Skin.dll"));
	std::function<int(int)> InitLicenKeys = reinterpret_cast<int(*)(int)>(GetProcAddress(SkinDLL, "InitLicenKeys"));
	std::function<int(int)> InitDecoration = reinterpret_cast<int(*)(int)>(GetProcAddress(SkinDLL, "InitDecoration"));
	std::function<int(int)> LoadSkinFromFile= reinterpret_cast<int(*)(int)>(GetProcAddress(SkinDLL, "LoadSkinFromFile"));
	std::function<int(int)> DecorateAs = reinterpret_cast<int(*)(int)>(GetProcAddress(SkinDLL, "DecorateAs"));
	std::function<int(int)> ApplySkin = reinterpret_cast<int(*)(int)>(GetProcAddress(SkinDLL, "ApplySkin"));
Wie rufe ich diese jetzt auf ?
03/07/2014 18:08 th0rex#7
z.b. InitLicenKeys(param1, param2, param3 usw....);
ABER das std::function<int(int)> ist nicht richtig. das erste int ist der rückgabe wert und das 2. der wert des 1. parameters glaube ich. Benutze immer nur das was ich gepostet habe so wie du es anscheinend auch gemacht hast. Wenn du dann das std::function<...> änderst musst du natürlich auch reinterpret_cast anpassen. Musst das halt auf die Funktion anpassen. Ich nutze aber lieber meine Version. Wahrscheinlich aber nur weil ich da weiß wo welcher typ für den 1. parameter hin muss, was ich bei std::function nicht sicher weiß.
03/07/2014 18:12 Terrat#8
warum crasht es wen ich die funktion aufrufe mit ?
InitDecoration(1);
ps projekt rangehängt
03/07/2014 18:36 th0rex#9
Sicher das der return typ von InitDecoration ein Int ist ?
03/07/2014 20:30 Padmak#10
BITTE lern erst was du hier machst, das ist ja katastrophal.

Padmak
03/07/2014 21:13 Terrat#11
Quote:
Originally Posted by Padmak View Post
BITTE lern erst was du hier machst, das ist ja katastrophal.

Padmak
:/ ? srysly
ich lerne doch steht hier irgend wo "das ich c++ behersche"
03/07/2014 21:13 YatoDev#12
wo ist der sinn das zu übersetzen ?
03/07/2014 22:30 Delinquenz#13
Quote:
ich lerne doch steht hier irgend wo "das ich c++ behersche"
Dann übersteigt das anscheinend deine Kompetenzen. C&P bringt dich nicht weiter.
03/07/2014 22:37 Mostey#14
Quote:
Originally Posted by omitma View Post
Er wird sowas gemacht haben:
Code:
typedef rückgabewert(__stdcall *name)
		(param1_type, param2_type);
Je nachdem wie die Funktion halt aussieht. Danach halt das:
Code:
name Funktion = (name)
		GetProcAddress(GetModuleHandle("dll"),
		"Funktion");
Für mich ist das ein Funktions pointer ^^ Funktioniert auch so. Frage mich nur was das System_Info und ZeroMemory da drinnen zu suchen hat. Deins geht aber natürlich auch.
Oh, das kann natürlich sein - erschließt sich mir aus dem gegebenen Kontext allerdings nicht. der TE postet irgendwie immer nur die Hälfte der Suppe.


Quote:
Originally Posted by omitma View Post
Wahrscheinlich aber nur weil ich da weiß wo welcher typ für den 1. parameter hin muss, was ich bei std::function nicht sicher weiß.
Wie meinst du das? Wenn du anschließend die Funktion aufrufst, bekommst du die Parameter (und deren Datentypen) auch angezeigt, sie haben eben nur keine Bezeichner.

Quote:
Originally Posted by omitma View Post
ABER das std::function<int(int)> ist nicht richtig. das erste int ist der rückgabe wert und das 2. der wert des 1. parameters glaube ich
Ja, haste schon richtig erkannt.
03/07/2014 23:08 Master674b#15
Quote:
Originally Posted by omitma View Post
Sicher das der return typ von InitDecoration ein Int ist ?
Der Rückgabewert einer Funktion kann niemals einen Crash verursachen wenn dieser nicht verwendet wird.
Also ist der Rückgabetyp egal, sofern er diesen nicht verwendet. Das Problem wird vielmehr die Funktionssignatur sein bzw. die verwendete Aufrufkonvention.

Btw: std::function macht hier wenig Sinn, da schleichen sich nur unnötige Fehler ein, da man dann die Aufrufkonvention nicht mehr direkt sehen kann. Da wäre soetwas schon besser:

Code:
typedef int (__cdecl *tInitDecoration) (int);
tInitDecoration pInitDecoration = reinterpret_cast<tInitDecoration>(
        GetProcAddress(skincrafterHandle, "InitDecoration"));
pInitDecoration(1);