Invalid Memory Access beim Zugriff auf eine DLL

Anfängerfragen zum Programmieren mit PureBasic.
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Invalid Memory Access beim Zugriff auf eine DLL

Beitrag von Beforegod »

Moin,

habe mir von TS-Soft die DLL2PBLib software runtergeladen und für die libmysql.dll genutzt.

Allerdings wenn ich über die DLL Versuche Zugriff auf eine DB zu bekommen, bricht er mit einem "Invalid Memory Access" ab. Im Debug Fenster sehe ich leider auch nix :(

Woran kann das liegen?
Diese Welt ist krank und ich bin es auch...
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Invalid Memory Access beim Zugriff auf eine DLL

Beitrag von Kiffi »

> Woran kann das liegen?

meine Kristallkugel ist z.Zt. in der Reparatur. Ein Stückchen Code wäre deshalb hilfreich.

Grüße ... Kiffi
a²+b²=mc²
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Beitrag von Beforegod »

hmm schade, soll ich dir meine leihen ;)

Code: Alles auswählen

IncludeFile "libmySQL.pb"

Global dbHnd.l
Global *sql

libmySQL_init()

OpenConsole()

mysql_init(dbHnd)

If mysql_real_connect(*sql, dbHnd, "xxx", "xxx", "xxx", 3306, "", 0) = 0
  Print(Str(dbHnd))
EndIf
und hier die funtkionen aus der libmysql.pb

Code: Alles auswählen

ProcedureDLL libmySQL_Init()
  Shared DLL.l
  DLL = LoadLibrary_("libmySQL.dll")
  If DLL
...
    mysql_real_connect = GetProcAddress_(DLL, "mysql_real_connect")

...
  EndIf
EndProcedure

ProcedureDLL.l mysql_real_connect(a.l,b.l,c.s,d.s,e.s,f.l,g.s,h.l)
  ProcedureReturn CallFunctionFast(mysql_real_connect,a,b,c,d,e,f,g,h)
EndProcedure

Er hängt bei dem connect (mysql_init klappt wunderbar)
Diese Welt ist krank und ich bin es auch...
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> hmm schade, soll ich dir meine leihen ;)

die scheint ja nicht viel zu taugen. Ansonsten würdest Du hier ja nicht nachfragen ;)

Ich lade mir gerade mal das mySQL-Paket herunter, um das
nachzuvollziehen. Parallel kannst Du mal versuchen, anstelle von
[c]CallFunctionFast()[/c] ein [c]CallCFunctionFast()[/c] zu verwenden.

// Edit:

An CallCFunctionFast() liegt's schon mal nicht...

Grüße ... Kiffi
a²+b²=mc²
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Beitrag von Beforegod »

Das witzige :

Mit dem Beispiel aus dem Codearchiv (soll ich den code hier posten) gehts einwandfrei.

Liegt es evt. daran das die sql Routinen über einen Wrapper aufgerufen werden?
Diese Welt ist krank und ich bin es auch...
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Beforegod hat geschrieben:Liegt es evt. daran das die sql Routinen über einen Wrapper aufgerufen werden?
Eigentlich nicht , kann es sein das die dll nicht im Compillerordner liegt ?

Edit : oups das "Er hängt bei dem connect (mysql_init klappt wunderbar)"
hab ich ueberlesen :-(
Zuletzt geändert von edel am 05.10.2005 11:34, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Mit dem Beispiel aus dem Codearchiv (soll ich den code hier posten) gehts
> einwandfrei.

so, wie ich das sehe, benötigst Du den Parameter [c]a[/c] nicht. Dieser wäre dazu
da, die DLL-Funktionsadresse zu übergeben, die Du in der ProcedureDLL aber
nicht benötigst, da Du ihn ja direkt angibst. Dein [c]mysql_real_connect[/c] ist also
in Wirklichkeit der Parameter [c]a[/c]

Code: Alles auswählen

ProcedureDLL.l mysql_real_connect(b.l,c.s,d.s,e.s,f.l,g.s,h.l)
  ProcedureReturn CallFunctionFast(mysql_real_connect,b,c,d,e,f,g,h)
EndProcedure 
Mangels [c]dbHnd[/c] kann ich das jetzt auch nicht verifizieren.

Grüße ... Kiffi
a²+b²=mc²
Beforegod
Beiträge: 34
Registriert: 21.09.2005 12:12

Beitrag von Beforegod »

Kiffi hat geschrieben:> Mit dem Beispiel aus dem Codearchiv (soll ich den code hier posten) gehts
> einwandfrei.

so, wie ich das sehe, benötigst Du den Parameter [c]a[/c] nicht. Dieser wäre dazu
da, die DLL-Funktionsadresse zu übergeben, die Du in der ProcedureDLL aber
nicht benötigst, da Du ihn ja direkt angibst. Dein [c]mysql_real_connect[/c] ist also
in Wirklichkeit der Parameter [c]a[/c]

Code: Alles auswählen

ProcedureDLL.l mysql_real_connect(b.l,c.s,d.s,e.s,f.l,g.s,h.l)
  ProcedureReturn CallFunctionFast(mysql_real_connect,b,c,d,e,f,g,h)
EndProcedure 
Mangels [c]dbHnd[/c] kann ich das jetzt auch nicht verifizieren.

Grüße ... Kiffi
hmm das mit dem dbHnd habe ich aus dem Codearchiv.
Ich probier mal diesen Parameter wegzulassen.

@hallodri :

Sie liegt im Ordner, daran liegts nicht :(

//Änderung :

Geht leider nicht. Parameter a bringt auch nix :(
Diese Welt ist krank und ich bin es auch...
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Vielleicht hilft dir das hier weiter , bin mir allerdings
nicht sicher ob ich alles richtig gemacht habe. MySQL.pb
Zuletzt geändert von edel am 19.01.2007 02:25, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> hmm das mit dem dbHnd habe ich aus dem Codearchiv.
> Ich probier mal diesen Parameter wegzulassen.

nein, ich meine nicht dbHnd, sondern *sql (was immer das sein mag).

Grüße ... Kiffi
a²+b²=mc²
Antworten