Forum: PC-Programmierung C/C++ dll Funktionszeiger Definition


von Rene B. (yob) Benutzerseite


Lesenswert?

Hallo Mikrocontroller Gemeinde,

ich brauche eure Hilfe beim einbinden einer extern bereitgestellten 
"dll".
Die Methoden der Dll sollen wiederum per JNI-Schnittstelle(Testentwürfe 
funktionieren schon) zur Verfügung gestellt werden.

Mein Hintergrund: Ich bin kein C/C++ Programmierer und weis nicht so 
richtig wie ich anfangen soll/muss. Mein Problem sind die 
Funktionszeiger, ich weis nicht wie die Definition dieser aussehen muss! 
Kann mir da bitte jemand weiterhelfen.


Dll-File ("AT_UHF.dll") // liegt im gleichen Verzeichnis
Lib-File zur Dll
Header-File ("AT_UHF.h") // liegt im gleichen Verzeichnis

Header-File Auszug:
1
#ifdef AT_UHF_EXPORTS
2
#define AT_UHF_API extern "C" __declspec(dllexport)
3
#else
4
#define AT_UHF_API extern "C" __declspec(dllimport)
5
#endif
6
7
/*****************************************************************************************************
8
////////////////////////////////////////// ¸Þ¼¼Áö Á¤ÀÇ ///////////////////////////////////////////////
9
******************************************************************************************************/
10
// ÅÂ±× ¸Þ¸ð¸®¸¦ ÀоúÀ»¶§ ¸Þ¼¼Áö.  ex) UID Data, Block Data
11
#define WM_UHF_GET_MEMORY_DATA WM_USER + 1610
12
13
// ¸í·É¿¡ ´ëÇÑ ÀÀ´äÀ» ¹Þ¾ÒÀ»¶§ ¸Þ¼¼Áö. ex) Àбâ, ¾²±â¿¡ ´ëÇÑ °á°ú ÄÚµå
14
#define WM_UHF_GET_REPLY  WM_USER + 1611
15
16
// access result code
17
typedef enum {
18
  OK       = 0,
19
  NOT_CONNECTED   = -1,
20
  NOT_DETECT   = -2,
21
  ACCESS_ERROR   = -3,
22
  NOT_OPENED   = -4, // han 2008.12.2
23
  INVALID_PARAMETER   = -5, // han 2008.12.2
24
  COMMAND_ERROR   = -6, // han 2008.12.2
25
  LOW_BATTERY   = -7, // han 2008.12.2
26
  Unknown   = -8, // han 2008.12.2
27
  NOT_SUPPORTED   = -9, // han 2008.12.11
28
  STOPPED   = -10, // han 2008.12.11
29
  POWER_OFF   = -11, // han 2008.12.17
30
} AccessResult;
31
32
// report mode bit field definition
33
typedef enum {
34
  WAIT_DONE  = 1, // han 2008.12.11
35
  ACCESS_EPC  = 2, // han 2008.12.11
36
  EXTENDED_INFORMATION = 4, // han 2008.12.16
37
} ReportMode;
38
39
/*
40
Inventory ¹× Access Operation Summary
41
+------------------------------+----------+-----------+-------------------------------------------------------+
42
| ÇÔ¼ö                         | continue | scan time | Stop event                                            |
43
|                              +----------+-----------+----------------+------------------+-------------------+
44
|                              | continue | scan time | error/success  | timeout          | Áß´Ü              |
45
+------------------------------+----------+-----------+----------------+------------------+-------------------+
46
| AT_UHF_ReadUID_TagSelect()   |  Yes     |  Endless  | error message  |         ---      | "Not Detect"/"OK" |
47
| AT_UHF_ReadUID()             +----------+-----------+----------------+------------------+-------------------+
48
| (EPC_GEN2_ONE_TAG_SELECT)    |  No      |  SCANTIME | error message  |"Not Detect"/"OK" | "Not Detect"/"OK" | 
49
+------------------------------+----------+-----------+----------------+------------------+-------------------+
50
| AT_UHF_ReadUID_TagSelect()   |          |           |                |                  |                   |
51
| AT_UHF_ReadUID()             |   x      |  SCANTIME | error message  |"Multi Read Stop" | "Multi Read Stop" | 
52
| (EPC_GEN2_MULTI_TAG_SELECT)  |          |           |                |                  |                   |
53
+------------------------------+----------+-----------+----------------+------------------+-------------------+
54
| AT_UHF_ReadEPC_Continuous()  |   x      |   Endless | error message  |         ---      | "Multi Read Stop" |
55
+------------------------------+----------+-----------+----------------+------------------+-------------------+
56
| ACCESS(READ/WRITE/LOCK/KILL) |   x      |  SCANTIME | error message  |"Not Detect"      | "Not Detect"      | READ Access
57
|                              |          |           | /Read Data     |                  |                   |
58
|                              |          |           +----------------+------------------+-------------------+
59
|                              |          |           | error message  |"Not Detect"      | "Not Detect"      |
60
|                              |          |           | /"Sucess"      |                  |                   |
61
+------------------------------+----------+-----------+----------------+------------------+-------------------+
62
63
* report event messages
64
Inventoried EPC  : WM_UHF_GET_MEMORY_DATA( (WPARAM)(DATA_FLAG_EPC=4), (LPARAM)(UINT)X )
65
Read Data    : WM_UHF_GET_MEMORY_DATA( (WPARAM)(DATA_FLAG_GENERAL=0), (LPARAM)(UINT)X )
66
Messages    : WM_UHF_GET_REPLY( (WPARAM)1, (LPARAM)(UINT)X )
67
Messages (_BankSelect Function Group) : WM_UHF_GET_MEMORY_DATA( (WPARAM)(DATA_FLAG_ACCESS_RESULT =5), (LPARAM)(UINT)X )
68
*/
69
70
/*****************************************************************************************************
71
ERROR MESSAGE WORDING LIST
72
73
TAG Backscatter Error -------------------------------------------------------------------
74
  "Other Error"        Tag Error Code 0x00
75
  "Memory Overrun"      Tag Error Code 0x03
76
  "Memory Locked"        Tag Error Code 0x04
77
  "Insufficient Tag Power"  Tag Error Code 0x0B
78
  "Non-specific Error"    Tag Error Code 0x0F
79
General Error ---------------------------------------------------------------------------
80
  "Check Antenna"        antenna °¡ ¿¬°áµÇÀÚ ¾ÊÀº °æ¿ì ¹ß»ý
81
  "Try after cooled"      ¸ðµâÀÌ °ú¿­µÇ °æ¿ì ¹ß»ý
82
  "Insufficient PDA Power"  ¸ðµâÀÇ Àü¿øÀÌ ³·¾Æ µ¿ÀÛÇÒ ¼ö ¾ø´Â °æ¿ì ¹ß»ý
83
¸í·É ½ÇÇà Á¾·á ¸Þ½ÃÁö -------------------------------------------------------------------
84
  "OK"            µ¿ÀÛÀÌ ¼º°øÀûÀ¸·Î ¿Ï·áµÈ °æ¿ì ¹ß»ý
85
  "Not Supported"        ¸ðµâÀÌ Á¦°øÇÏÁö ¾Ê´Â ±â´ÉÀ» ¿äûÇÑ °æ¿ì ¹ß»ýÇÔ.
86
  "Not Connected"        ¸ðµâÀÌ open ÈÄ Á¤»óÀûÀ¸·Î ¹ÝÀÀÇÏÁö ¾Ê´Â °æ¿ì ¹ß»ýÇÔ.
87
  "Not Opened"        Open ÇÏÁö ¾Ê°í ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °æ¿ì ¹ß»ýÇÔ.
88
  "Bad Access Password"    À߸øµÈ access password ¸¦ ÁöÁ¤ÇÑ °æ¿ì ¹ß»ý
89
  "Invalid Parameter"      ÇÔ¼ö È£Ãâ½Ã À¯È¿ÇÏÁö ¾ÊÀº Àμö¸¦ ÁöÁ¤ÇÑ °æ¿ì¿¡ ¹ß»ýÇÔ.
90
  "Command Error"        command ½ÇÇàÁß ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì ¹ß»ýÇÔ.
91
  "Success"          ÇÔ¼öÀÇ ½ÇÇàÀÌ ¼º°øÀûÀ¸·Î ¿Ï·áµÈ °æ¿ì¿¡ ¹ß»ýÇÔ.
92
  "Not Detect"        Access ¸í·ÉÀÌ tag ¸¦ ãÁö ¸øÇϰí Á¾·áµÈ °æ¿ì¿¡ ¹ß»ýÇÔ.
93
  "Multi Read Stop"      Multi read ( Inventory ) °¡ App ¿¡¼­ Á¾·á ¿äûÀ» ¹Þ¾Æ Á¾·áµÈ °æ¿ì¿¡ ¹ß»ýÇÔ.
94
  "EAS"            NXP tag Ư¼ö ±â´ÉÀ̸ç, EAS °¡ °¨ÁöµÈ °æ¿ì¿¡ ¹ß»ýÇÔ.  
95
*****************************************************************************************************/
96
97
98
99
/*****************************************************************************************************
100
///////////////////////////////////// ±âº» ÇÔ¼ö ½ÃÀÛ /////////////////////////////////////////////
101
******************************************************************************************************/
102
103
AT_UHF_API void AT_UHF_PowerON();
104
/*****************************************************************************************************
105
Description   : UHF ¸ðµâÀÇ Àü¿øÀ» ÄÒ´Ù.
106
Parameter     : void
107
Return        : void
108
Protocol Type : EPC Gen2
109
******************************************************************************************************/
110
111
AT_UHF_API void AT_UHF_PowerOFF();
112
/*****************************************************************************************************
113
Description   : UHF ¸ðµâÀÇ Àü¿øÀ» ²ö´Ù.
114
Parameter     : void
115
Return        : void
116
Protocol Type : EPC Gen2
117
******************************************************************************************************/
118
119
AT_UHF_API BOOL AT_UHF_PowerOnInit();
120
/*****************************************************************************************************
121
Description   : ApplicationÀÌ Á¾·áµÇÁö ¾ÊÀº »óÅ¿¡¼­ PDAÀÇ Àü¿øÀÌ OFFµÈÈÄ ´Ù½Ã ONµÇ¾úÀ» ¶§ ¸ðµâ »óŸ¦
122
        OFFµÇ±â ÀÌÀüÀ¸·Î ¼³Á¤ÇÑ´Ù.
123
        PowerNotify À̺¥Æ®°¡ ¹ß»ý ÇßÀ» ¶§ Application¿¡¼­´Â ¹Ýµå½Ã ÀÌ ÇÔ¼ö¸¦ ½ÇÇàÇØ¾ß ÇÑ´Ù.
124
Parameter     : void
125
Return        : true = ½ÇÇà ¼º°ø, false = ½ÇÇà ½ÇÆÐ
126
Protocol Type : EPC Gen2
127
******************************************************************************************************/
128
129
AT_UHF_API BOOL AT_UHF_Open();
130
/*****************************************************************************************************
131
Description   : UHF ¸ðµâÀÇ Åë½Å Æ÷¸¦ ¿ÀÇÂÇÑ´Ù.
132
Parameter     : void
133
Return        : true = ¿ÀÇ ¼º°ø, false = ¿ÀÇ ½ÇÆÐ
134
Protocol Type : EPC Gen2
135
******************************************************************************************************/
136
137
AT_UHF_API void AT_UHF_HWND(HWND handle);
138
AT_UHF_API void AT_UHF_HWND_EX(HWND handle, UINT report_mode_set, UINT report_mode_reset); // han 2008.12.1
139
/*****************************************************************************************************
140
Description   : ¸ðµâ·Î ºÎÅÍ ÀÀ´äÀ» ¹Þ±â À§ÇÑ À©µµ¿ì ÇÚµéÀ» ¼³Á¤ÇÑ´Ù.
141
Parameter     : HWND handle ÇØ´ç ¾îÇø®ÄÉÀ̼ÇÀÇ À©µµ¿ì ÇÚµé
142
Return        : void
143
remark        : report_mode ÀÇ °¢ bit º° Àǹ̴ ´ÙÀ½°ú °°´Ù.
144
                   REPORT_MODE_SUPRESS_DONE_MESSAGE = 1 ; È£ÃâµÈ ÇÔ¼ö°¡ ¿Ï·áµÇ¾úÀ½À» ¾Ë·ÁÁÖ´Â message ¸¦ »ý·«ÇÑ´Ù.
145
Protocol Type : EPC Gen2
146
******************************************************************************************************/
147
148
AT_UHF_API BOOL AT_UHF_IsOpen();
149
/*****************************************************************************************************
150
Description   : Åë½Å Æ÷Æ®ÀÇ »ç¿ë¿©ºÎ¸¦ È®ÀÎÇÑ´Ù.
151
Parameter     : void
152
Return        : true = Æ÷Æ®°¡ ¿­·ÁÀÖÀ½, false = Æ÷Æ®°¡ ¿­·ÁÀÖÁö ¾ÊÀ½
153
Protocol Type : EPC Gen2
154
******************************************************************************************************/
155
156
AT_UHF_API void AT_UHF_Close();
157
/*****************************************************************************************************
158
Description   : Åë½Å Æ÷Æ®¸¦ ´Ý´Â´Ù.
159
Parameter     : void
160
Return        : void
161
Protocol Type : EPC Gen2
162
******************************************************************************************************/


Beispiel: explizites Dll-Linking
Quelle: http://msdn.microsoft.com/en-us/library/64tkc9y5
1
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
2
...
3
4
HINSTANCE hDLL;               // Handle to DLL
5
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
6
DWORD dwParam1;
7
UINT  uParam2, uReturnVal;
8
9
hDLL = LoadLibrary("MyDLL");
10
if (hDLL != NULL)
11
{
12
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1");
13
   if (!lpfnDllFunc1)
14
   {
15
      // handle the error
16
      FreeLibrary(hDLL);
17
      return SOME_ERROR_CODE;
18
   }
19
   else
20
   {
21
      // call the function
22
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
23
   }
24
}

Mein Versuch für 2 Methoden aus Dll.
- AT_UHF_PowerON()  Return : none
- AT_UHF_Open()     Return : true/false
1
typedef void (CALLBACK* LPFNDLLFUNC1);
2
typedef bool (CALLBACK* LPFNDLLFUNC1);
3
bool uReturnVal1, uReturnVal2;
4
5
HINSTANCE hDLL;               // Handle to DLL
6
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
7
8
hDLL = LoadLibrary("AT_UHF.dll");
9
if (hDLL != NULL)
10
{
11
/*** PowerON ***/
12
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "AT_UHF_PowerON");
13
   if (!lpfnDllFunc1)
14
   {
15
      // handle the error
16
      FreeLibrary(hDLL);
17
      return -1;
18
   }
19
   else
20
   {
21
      // call the function
22
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
23
   }
24
/*** PowerOpen ***/
25
   lpfnDllFunc2 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "AT_UHF_Open");
26
   if (!lpfnDllFunc2)
27
   {
28
      // handle the error
29
      FreeLibrary(hDLL);
30
      return -2;
31
   }
32
   else
33
   {
34
      // call the function
35
      uReturnVal2 = lpfnDllFunc2();
36
   }
37
}

Falls es zuwenig Informationen sind. Bitte fragen.

VG, Rene

von g457 (Gast)


Lesenswert?

> Lib-File zur Dll
..
> Beispiel: explizites Dll-Linking
            ^^^^^^^^^^

..wozu? Link doch einfach(tm) gegen die lib, dann hast Du die Prototypen 
schon fertig im mitgelieferten Header.

Oder was ∗genau∗ ist das Problem?

von Rene B. (yob) Benutzerseite


Lesenswert?

Sry, ich kann dir nicht richtig folgen! Ich hoffe ich hab es trotzdem 
halb
wegs verstanden. Hier mal eine Idee.
1
#include "CallApi.h"
2
#include <windows.h>
3
#include "AT_UHF.h" <<<< *Header-Datei der Dll einbinden*
4
5
#pragma comment(lib,"AT_UHF.lib") <<<< *Meinst du das?*
6
7
*damit linke ich zur Biblithok und kann Methoden dann direkt so verwenden
8
wie sie in der Header-Datei stehen?*
9
10
JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
11
  (JNIEnv *env, jobject thisObject, jbool jb)
12
{
13
    *Hier muss der c/c++ code fuer die jeweilige Methode rein*
14
    bool jb;
15
    jb = AT_UHF_Open();
16
    return jb;
17
}

Am Ende das ganze wieder comilieren & fertig ?

von g457 (Gast)


Lesenswert?

> Am Ende das ganze wieder comilieren & fertig ?

Ja.

von Rene B. (yob) Benutzerseite


Lesenswert?

Ich habe mich weiter damit beschäftigt jedoch ohne Erfolg. Mein 
jetztiger Stand sieht wie folgt aus. (Ist auf ein minimum 
runtergebrochen)

test.cpp // compiliert mit cl von visual studio 9.0
compile-anweisung: cl test.cpp
1
#include "AT_UHF.h"
2
3
#pragma comment(lib,"AT_UHF.lib")
4
5
6
void main() {
7
8
}

output des compilers:
>> fazit: das Header-File(siehe 1. Post) wird nicht richtig interpretiert ab hier 
bin ich ratlos
1
c:\javadllhello\t\AT_UHF.h(119) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'AT_UHF_PowerOnInit'
2
c:\javadllhello\t\AT_UHF.h(119) : error C4430: Fehlender Typspezifizierer - intwird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
3
c:\javadllhello\t\AT_UHF.h(119) : error C4430: Fehlender Typspezifizierer - intwird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
4
c:\javadllhello\t\AT_UHF.h(129) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'AT_UHF_Open'
5
c:\javadllhello\t\AT_UHF.h(129) : error C4430: Fehlender Typspezifizierer - intwird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
6
c:\javadllhello\t\AT_UHF.h(129) : error C4430: Fehlender Typspezifizierer - intwird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
7
c:\javadllhello\t\AT_UHF.h(137) : error C2065: 'HWND': nichtdeklarierter Bezeichner
8
c:\javadllhello\t\AT_UHF.h(137) : error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'handle'
9
c:\javadllhello\t\AT_UHF.h(137) : error C2182: 'AT_UHF_HWND': Unzulässige Verwendung des Typs 'void'
10
c:\javadllhello\t\AT_UHF.h(137) : error C2491: 'AT_UHF_HWND': Definition von Daten für dllimport nicht zulässig
11
12
usw. sind über 100 Fehlermeldungen

jemand vieleicht eine Idee was ich falsch mache?

von Karl H. (kbuchegg)


Lesenswert?

Rene B. schrieb:

> c:\javadllhello\t\AT_UHF.h(119) : error C2146: Syntaxfehler: Fehlendes
> ';' vor Bezeichner 'AT_UHF_PowerOnInit'

Was steht vor AT_UHF_PowerOnInit im Header File?

Das steht BOOL

BOOL ist kein Standard C++ Datentyp. Wo kommt der also her?


> c:\javadllhello\t\AT_UHF.h(137) : error C2065: 'HWND': nichtdeklarierter
> Bezeichner

Auch HWND ist kein Standard Datentyp. Wo kommt der her?


-> Beide Datentypen werden aber normalerweise zb über windows.h 
hereingezogen
-> Vermutung: Dir fehlt ein include von windows.h



Bei einer Fehlermeldung
1
Fehlendes ';' vor Bezeichner 'AT_UHF_PowerOnInit'
moniert der Compiler praktisch immer ein Wort an, das er nicht kennt. 
Geh in die bewusste Zeile und meistens ist es ganz banal das Wort vor 
dem in der Fehlermeldung genannten. Bei dir eben BOOL

von Rene B. (yob) Benutzerseite


Lesenswert?

grandiose Hilfestellung ^^.

+ #include <windows.h>
+ doppelten typedef im header auskommentiert

Es kompiliert und funktioniert. Man muss sich also doch ganz gut mit 
c/c++ auskennen, also mehr damit beschäftigen ^^.


Danke nochmals, Karl.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.