DLL funktioniert nur unter C

  • C/C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • DLL funktioniert nur unter C

    Ich habe folgendes Problem. Ich habe eine DLL geschrieben womit man überprüfen kann ob der Mauszeiger über ein Objekt ist. Nun es funktioniert auch alles herrvoragend unter C. Mit GML gemischt habe ich eine fps von 60 bei 100 Dreiecken erzielt. Als Ich alles komplett ohne GML gemacht habe, habe ich eine unglaubliche fps von 1200 bei 10000 Dreiecken erzielt, aber leider Bugy weil C nicht richtig zwei dimensionale Arrays unterstützt.
    Es war eigentlich der Plan gleich C++ zu nehemen, aber genau da gab es Probleme. Es lässt sich zwar alles ohne Fehler Compilern und die DLL wird zwar auch erstellt und sieht auch ordentlich aus, aber im Game Maker sieht man garnichts. Nun die Frage ist, was mache ich Falsch sodass es nicht in C++ funktioniert?

    Der Header
    Spoiler anzeigen

    Quellcode

    1. #ifndef _DLL_H_
    2. #define _DLL_H_
    3. #if BUILDING_DLL
    4. # define DLLIMPORT __declspec (dllexport)
    5. #else /* Not BUILDING_DLL */
    6. # define DLLIMPORT __declspec (dllimport)
    7. #endif /* Not BUILDING_DLL */
    8. DLLIMPORT double point_in_triangle(double x1, double y1, double x2, double y2, double x3, double y3, double xp, double yp);
    9. DLLIMPORT double convert_prepare(double arg0, double arg1, double arg2, double arg3, double arg4, double arg5, double arg6, double arg7, double arg8, double arg9, double arg10, double arg11);
    10. DLLIMPORT double convert_3d(double targetx, double targety, double targetz);
    11. DLLIMPORT double convert_get_x_2d();
    12. DLLIMPORT double convert_get_y_2d();
    13. DLLIMPORT double poo_begin();
    14. DLLIMPORT double poo_vertex(double vertX, double vertY, double vertZ);
    15. DLLIMPORT double poo_end();
    16. DLLIMPORT double poo_check(double obj, double pointX, double pointY);
    17. #endif /* _DLL_H_ */
    Alles anzeigen


    Der Sourcecode
    Spoiler anzeigen

    C-Quellcode

    1. #include "dll.h"
    2. #include <windows.h>
    3. #include <stdio.h>
    4. #include <stdlib.h>
    5. #include <math.h>
    6. short sign(double arg)
    7. {
    8. if(arg < 0)
    9. return(-1);
    10. if(arg == 0)
    11. return(0);
    12. if(arg > 0)
    13. return(1);
    14. }
    15. double sqr(double arg)
    16. {
    17. return(arg*arg);
    18. }
    19. double cam_dX;
    20. double cam_dY;
    21. double cam_dZ;
    22. double cam_uX;
    23. double cam_uY;
    24. double cam_uZ;
    25. double cam_vX;
    26. double cam_vY;
    27. double cam_vZ;
    28. double cam_xfrom;
    29. double cam_yfrom;
    30. double cam_zfrom;
    31. double screen_width;
    32. double screen_height;
    33. double tFOV;
    34. double poo_vertexe_x[0][1023];
    35. double poo_vertexe_y[0][1023];
    36. double poo_vertexe_z[0][1023];
    37. int objektnumber = 0;
    38. const float pi = 3.14159f;
    39. double x_2d;
    40. double y_2d;
    41. DLLIMPORT double point_in_triangle(double x1, double y1, double x2, double y2, double x3, double y3, double xp, double yp)
    42. {
    43. double a = (x1-xp)*(y2-yp)-(x2-xp)*(y1-yp);
    44. double b = (x2-xp)*(y3-yp)-(x3-xp)*(y2-yp);
    45. double c = (x3-xp)*(y1-yp)-(x1-xp)*(y3-yp);
    46. double back;
    47. if(sign(a) == sign(b) && sign(b) == sign(c))
    48. back = 1;
    49. else
    50. back = 0;
    51. return(back);
    52. }
    53. DLLIMPORT double convert_prepare(double arg0, double arg1, double arg2, double arg3, double arg4, double arg5, double arg6, double arg7, double arg8, double arg9, double arg10, double arg11)
    54. {
    55. double mm;
    56. cam_dX = arg3 - arg0;
    57. cam_dY = arg4 - arg1;
    58. cam_dZ = arg5 - arg2;
    59. mm = sqrt(cam_dX*cam_dX + cam_dY*cam_dY + cam_dZ*cam_dZ);
    60. cam_dX /= mm;
    61. cam_dY /= mm;
    62. cam_dZ /= mm;
    63. cam_uX = arg6;
    64. cam_uY = arg7;
    65. cam_uZ = arg8;
    66. mm = cam_uX*cam_dX + cam_uY*cam_dY + cam_uZ*cam_dZ;
    67. cam_uX -= mm*cam_dX;
    68. cam_uY -= mm*cam_dY;
    69. cam_uZ -= mm*cam_dZ;
    70. mm = sqrt(cam_uX*cam_uX + cam_uY*cam_uY + cam_uZ*cam_uZ);
    71. cam_uX /= mm;
    72. cam_uY /= mm;
    73. cam_uZ /= mm;
    74. tFOV = tan(arg9*pi/360);
    75. cam_uX *= tFOV;
    76. cam_uY *= tFOV;
    77. cam_uZ *= tFOV;
    78. cam_vX = cam_uY*cam_dZ - cam_dY*cam_uZ;
    79. cam_vY = cam_uZ*cam_dX - cam_dZ*cam_uX;
    80. cam_vZ = cam_uX*cam_dY - cam_dX*cam_uY;
    81. cam_vX *= arg10/arg11;
    82. cam_vY *= arg10/arg11;
    83. cam_vZ *= arg10/arg11;
    84. cam_xfrom = arg0;
    85. cam_yfrom = arg1;
    86. cam_zfrom = arg2;
    87. screen_width = arg10;
    88. screen_height = arg11;
    89. return(1);
    90. }
    91. DLLIMPORT double convert_3d(double targetx, double targety, double targetz)
    92. {
    93. double pX;
    94. double pY;
    95. double pZ;
    96. double mm;
    97. pX = targetx - cam_xfrom;
    98. pY = targety - cam_yfrom;
    99. pZ = targetz - cam_zfrom;
    100. mm = pX*cam_dX + pY*cam_dY + pZ*cam_dZ;
    101. if (mm > 0)
    102. {
    103. pX /= mm;
    104. pY /= mm;
    105. pZ /= mm;
    106. }
    107. else
    108. {
    109. x_2d = 0;
    110. y_2d = -100;
    111. return (0);
    112. }
    113. mm = (pX*cam_vX + pY*cam_vY + pZ*cam_vZ) / sqr((screen_width/screen_height)*tan(45*pi/360));
    114. x_2d = (mm+1)/2*screen_width;
    115. mm = (pX*cam_uX + pY*cam_uY + pZ*cam_uZ) / sqr(tan(45*pi/360));
    116. y_2d = (1-mm)/2*screen_height;
    117. return(1);
    118. }
    119. DLLIMPORT double convert_get_x_2d()
    120. {
    121. return(x_2d);
    122. }
    123. DLLIMPORT double convert_get_y_2d()
    124. {
    125. return(y_2d);
    126. }
    127. DLLIMPORT double poo_begin()
    128. {
    129. poo_vertexe_x[objektnumber][0] = 1;
    130. poo_vertexe_y[objektnumber][0] = 1;
    131. poo_vertexe_z[objektnumber][0] = 1;
    132. return(1);
    133. }
    134. DLLIMPORT double poo_vertex(double vertX, double vertY, double vertZ)
    135. {
    136. poo_vertexe_x[objektnumber][(int)poo_vertexe_x[objektnumber][0]] = vertX;
    137. poo_vertexe_y[objektnumber][(int)poo_vertexe_x[objektnumber][0]] = vertY;
    138. poo_vertexe_z[objektnumber][(int)poo_vertexe_x[objektnumber][0]] = vertZ;
    139. poo_vertexe_x[objektnumber][0] += 1;
    140. poo_vertexe_y[objektnumber][0] += 1;
    141. poo_vertexe_z[objektnumber][0] += 1;
    142. return(1);
    143. }
    144. DLLIMPORT double poo_end()
    145. {
    146. objektnumber += 1;
    147. return(objektnumber - 1);
    148. }
    149. DLLIMPORT double poo_check(double obj, double pointX, double pointY)
    150. {
    151. double back = 0;
    152. int objekt;
    153. double px1;
    154. double py1;
    155. double px2;
    156. double py2;
    157. double px3;
    158. double py3;
    159. objekt = (int)obj;
    160. int i;
    161. for(i=1; i<poo_vertexe_x[objekt][0]; i+=3)
    162. {
    163. convert_3d(poo_vertexe_x[objekt][i],poo_vertexe_y[objekt][i],poo_vertexe_z[objekt][i]);
    164. px1 = x_2d;
    165. py1 = y_2d;
    166. convert_3d(poo_vertexe_x[objekt][i+1],poo_vertexe_y[objekt][i+1],poo_vertexe_z[objekt][i+1]);
    167. px2 = x_2d;
    168. py2 = y_2d;
    169. convert_3d(poo_vertexe_x[objekt][i+2],poo_vertexe_y[objekt][i+2],poo_vertexe_z[objekt][i+2]);
    170. px3 = x_2d;
    171. py3 = y_2d;
    172. if(point_in_triangle(px1,py1,px2,py2,px3,py3,pointX,pointY))
    173. {
    174. back = 1;
    175. break;
    176. }
    177. }
    178. return(back);
    179. }
    180. BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
    181. DWORD reason /* Reason this function is being called. */ ,
    182. LPVOID reserved /* Not used. */ )
    183. {
    184. switch (reason)
    185. {
    186. case DLL_PROCESS_ATTACH:
    187. break;
    188. case DLL_PROCESS_DETACH:
    189. break;
    190. case DLL_THREAD_ATTACH:
    191. break;
    192. case DLL_THREAD_DETACH:
    193. break;
    194. }
    195. /* Returns TRUE on success, FALSE on failure */
    196. return TRUE;
    197. }
    Alles anzeigen
  • Mit diesem Thema (wenn ich auch für einen anderen Bereich) habe ich mich vor kurzem erst beschäftig.

    Was mich wundert ist, dass wie du darauf kommst einfach den Code von C für ++ und Game Maker zu übernehmen.
    Der Unterschied ist doch ganz klar, dass der Game Maker und C++ Objektorientiert arbeiten (klassen etc), C jedoch nicht.

    der Code ist zwar portierbar, aber sowas wie int, char und co wirst du im Gamemaker vergeblich suchen.
    bei C++ kenne ich mich zwar nicht genügend aus, um dazu ein Statement abzugeben, jedoch (auch wenn es eine erweiterung ist) hat es einen anderen Standart als der von C.
    so kann es zwar durchaus sein, dass die Syntax richtig ist (würde mich auch wundern, wenn sie das nicht würde) aber letztendlich volkommener Käse rauskommt.
  • Mit welcher Entwicklungsumgebung hast du das denn kompiliert? MS VS, Netbeans, Eclipse, etc.?
    Schau mal nach, ob du es genau so machst, wie es in diesem Tutorial beschrieben ist.
    In deinem Header sieht die Präprozessoranweisung für das Exportieren der Dll etwas anders aus als in dem Tutorial.

    Quellcode

    1. #define GMEXPORT extern "C" __declspec (dllexport)

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • Ich habe etwas seltsames herausgefunden. Ich habe es mit extern "C" versucht und jetzt sagt der Game Maker das ich eine Zugriffsverletzung auf einer Speicheradresse mache wenn ich die Funktion poo_vertex aufrufe. Wenn ich die Funktion nicht aufrufe und es wie vorher mit GML mische funktioniert alles wieder. Dann habe ich herausgefunden dass einfach der Speicherplatz im Array nicht reserviert habe bei

    Quellcode

    1. double poo_vertexe_x[0][1023];
    2. double poo_vertexe_y[0][1023];
    3. double poo_vertexe_z[0][1023];

    habe ich geändert in

    Quellcode

    1. double poo_vertexe_x[1023][1023];
    2. double poo_vertexe_y[1023][1023];
    3. double poo_vertexe_z[1023][1023];


    Nun zeigt er keine Zugriffsverletzung mehr an, aber es geschieht jetzt genauso wie vorher nichts, und selbst wenn ich es mit GML mische obwohl es nichts miteinander zutun hat, passiert nichts. Es findet keine Kollision statt, zwischen Maus und Objekt. In C war es wenigstens so, dass wenn man irgendwo in die Leere zeigt eine Kollision auftritt. Das ist alles sehr seltsam.
  • Benutzer online 1

    1 Besucher