Forums Neueste Beiträge
 

Übergabe von C-Struktur an 3rd-Party SW nach Migration VC++==>VS20

26/06/2008 - 09:49 von ask-it | Report spam
Ich hab ein Problem mit 3 Programmen, die alle das gleiche API einer 3rd
Party-SW benutzen.

Die Programme sind mit VC++ 6 entwickelt. Diese Versionen laufen auch
tadellos.

Nun habe ich die Programme mit VS2005 neu erstellt (Projekt in VS2005
automatisch migrieren lassen); und ich habe an allen APIs, die eine Variable
vom Typ EMEVT_MSG (s. unten) als Pointer auf diese Struktur übergeben oder
erhalten das Problem, daß die Felder ab einem bestimmten Punkt nicht passen.

Die Struktur sieht so aus (.h-Datei des 3rd Party-SDKs):

typedef struct _emevt_message
{
time_t evtm_time; /* OPT time of message */
UINT evtm_msgnum; /* OPT msg # */
UINT evtm_color; /* OPT color indicator */
UINT evtm_attrib; /* OPT attribute indicator */
UINT evtm_token; /* OPT token/num/offset */
UINT evtm_flags; /* OPT flags */
UINT evtm_type; /* OPT type */
UINT evtm_rsrvd1[4]; /* RES reserved */

char evtm_severity[EMEVT_MAXLEN_SEVERITY]; /* OPT I,W,E,S,F, ... */

char *evtm_text; /* REQ msg text */
char *evtm_node; /* OPT domainnodeid responsible for msg */
char *evtm_user; /* OPT domainuserid responsible for msg */
char *evtm_category; /* OPT category */
char *evtm_source; /* OPT source */
char *evtm_station; /* OPT workstation associated with msg */
char *evtm_workload; /* OPT workload information section */
char *evtm_pinfo; /* OPT process/program information */
void *evtm_bindata; /* OPT binary data section */
/* ( e.g., NT EventLog record ) */
char *evtm_device; /* OPT SNMP device */
char *evtm_udata; /* OPT User data */
char *evtm_tag; /* OPT Tag */
char *evtm_rsrvd2[4]; /* RES reserved */

} EMEVT_MSG;

Definiere ich meine eigene Struktur und lasse evtm_severity einfach weg,
dann funktioniert das ganze wieder (zumindestens wenn ich die Daten in der
Struktur von der 3rd Party-SW erhalte [ich bekomme einen Void Pointer und
caste ihn auf die eigene gepatchte Struktur ]) - natürlich ohne
evtm_severity-Daten (auskommentiert).

Wenn ich die originale (korrekte) Struktur an das SDK übergebe, dann bekomme
ich einen Parameter-Fehler. Die gepatchte Struktur kann ich nicht übergeben,
da hier kein Void Pointer übergeben wird, sondern ein Pointer auf die
originale Struktur.

Wie gesagt, die mit VC++ 6 erstellten Programme laufen in der gleichen
Umgebung tadellos.

Irgendeine Idee? Es muß doch letztendlich damit zutun haben, wie die
Struktur im Speicher abgebildet wird - offensichtlich unterschiedlich
zwischen meinem (mit VS2005 erstellten) Programm und der 3rd Party Library.
Irgendein Compiler Switch oder so???

Für Hilfe wàre ich dankbar.

Sven.
 

Lesen sie die antworten

#1 Jochen Kalmbach [MVP]
26/06/2008 - 11:05 | Warnen spam
Hallo ask-it!

time_t evtm_time; /* OPT time of message */



AB VS2005 gibt es zwei verschiedene "time_t" Strukuren.
Eine mit 64-Bit und eine "herkömmliche". Stelle sicher, dass Du

_USE_32BIT_TIME_T

in den Projekteinstellungen definiert hast!!


Für Hilfe wàre ich dankbar.



Wie ist denn das "packing/alignment" eingestellt?

Greetings
Jochen

Ähnliche fragen