190 Warner 4 RasApi32(W2K)
Hallo,
habe deinen C++ mal schnell in Delphi umgesetzt, läuft unter 2000 SP 3 einwandfrei.?(
Hier der Code:
function RasEnumEntriesA(
reserved: PAnsiChar;
lpszPhoneBook: PAnsiChar;
entrynamesArray: LPRasEntryName;
var lpcb: DWORD;
var lpcEntries: DWORD
): DWORD; stdcall; external \'rasapi32.dll\';
procedure TForm1.Button1Click(Sender: TObject);
Var
cb: DWORD; // size in bytes of buffer
cEntries: DWORD; // Anzahl der Einträge
nRet: DWORD;
pszPhonebook : PCHAR;
RasEntryName : LPRasEntryName;
begin
pszPhonebook := NIL;
cb := sizeof(TRasEntryNameA);
RasEntryName := LPRasEntryName(GlobalAlloc(GPTR, cb));
RasEntryName.dwSize := sizeof(TRasEntryNameA);
Repeat
nRet := RasEnumEntriesA(NIL, pszPhonebook, RasEntryName, cb, cEntries);
if nRet = ERROR_BUFFER_TOO_SMALL Then
begin
GlobalFree(DWORD(RasEntryName));
RasEntryName := LPRasEntryName(GlobalAlloc(GPTR, cb));;
RasEntryName.dwSize := sizeof(TRasEntryNameA);
end;
Until nRet = ERROR_SUCCESS;
ShowMessage ( IntToStr(cEntries) + \' \' + RasEntryName.szEntryName); // nur 1. Eintrag zeigen
GlobalFree(DWORD(RasEntryName));
end;
--
mirko
habe deinen C++ mal schnell in Delphi umgesetzt, läuft unter 2000 SP 3 einwandfrei.?(
Hier der Code:
function RasEnumEntriesA(
reserved: PAnsiChar;
lpszPhoneBook: PAnsiChar;
entrynamesArray: LPRasEntryName;
var lpcb: DWORD;
var lpcEntries: DWORD
): DWORD; stdcall; external \'rasapi32.dll\';
procedure TForm1.Button1Click(Sender: TObject);
Var
cb: DWORD; // size in bytes of buffer
cEntries: DWORD; // Anzahl der Einträge
nRet: DWORD;
pszPhonebook : PCHAR;
RasEntryName : LPRasEntryName;
begin
pszPhonebook := NIL;
cb := sizeof(TRasEntryNameA);
RasEntryName := LPRasEntryName(GlobalAlloc(GPTR, cb));
RasEntryName.dwSize := sizeof(TRasEntryNameA);
Repeat
nRet := RasEnumEntriesA(NIL, pszPhonebook, RasEntryName, cb, cEntries);
if nRet = ERROR_BUFFER_TOO_SMALL Then
begin
GlobalFree(DWORD(RasEntryName));
RasEntryName := LPRasEntryName(GlobalAlloc(GPTR, cb));;
RasEntryName.dwSize := sizeof(TRasEntryNameA);
end;
Until nRet = ERROR_SUCCESS;
ShowMessage ( IntToStr(cEntries) + \' \' + RasEntryName.szEntryName); // nur 1. Eintrag zeigen
GlobalFree(DWORD(RasEntryName));
end;
--
mirko
Die originale DLL in D:WINNTsystem32 heist bei mir XDDCASPX.DLL
Debug Fenster (VS 6.0)
\"D:WINNTsystem32rasapi32.dll\" wurde geladen.
...
\"D:WINNTsystem32XDDCASPX.DLL\" wurde geladen.
...
\"H:Programme190 Warnerwhelper.dll\" wurde geladen.
Es werden also die sowohl die \"Wrapper-DLL\" als auch die Original-DLL geladen
Klicken auf \"DFÃœ-Netzwerk\" im 0190 Warner Hauptfenster funktioniert korrekt und zeigt alle Ras-Einträge.
--
Siggi
Debug Fenster (VS 6.0)
\"D:WINNTsystem32rasapi32.dll\" wurde geladen.
...
\"D:WINNTsystem32XDDCASPX.DLL\" wurde geladen.
...
\"H:Programme190 Warnerwhelper.dll\" wurde geladen.
Es werden also die sowohl die \"Wrapper-DLL\" als auch die Original-DLL geladen
Klicken auf \"DFÃœ-Netzwerk\" im 0190 Warner Hauptfenster funktioniert korrekt und zeigt alle Ras-Einträge.
--
Siggi
Check das bitte nochmal. Die Wrapper DLL \"jumpt\" natürlich zur Funktion der originalen DLL. Existiert die originale DLL nicht bzw. du hast die Wrapper DLL in einen falschen Ordner von Hand kopiert, dann ist der Wert NULL = Funktion nicht importiert. Den Namen der originalen rasapi32.dll siehst du auch im Debugger über die geladenen Module (so heisst das in Delphi), der Dateiname besteht aus sinnlosen Buchstaben z.B. QWZGFG.dll und heisst auf jedem PC anders.
Im 0190 Warner Hauptfenster kannst du auf \"DFÜ-Netzwerk\" klicken, dann wird auch RasEnumEntriesA aufgerufen, geht das?
--
mirko
Im 0190 Warner Hauptfenster kannst du auf \"DFÜ-Netzwerk\" klicken, dann wird auch RasEnumEntriesA aufgerufen, geht das?
--
mirko
2.Nachtrag
Sorry, unter XP funktioniert es doch, beim fehlgeschlagenen Versuch unter XP befand sich eine Kopie der RasApi32-Wrapper-DLL für XP im Verzeichnis des getesteten Programms. Nach entfernen der Kopie und Reboot klappte es wieder
Debuggen im Disassmbly Mode (unter W2k und VS 6.0) bringt folgendes zutage:
Bis zur Wrapper-DLL
----------
5701BE58 jmp dword ptr ds:[57021990h]
5701BE5E ret
----------
--> Sprung jmp dword ptr ds:[57021990h] führt auf Adresse 00000000h
Ansonsten alles wie beim 1.Nachtrag.
D.H. der Inhalt von 57021990h und weiterer Stellen in der Umgebung ist 00000000h
Die RasApi32-Wrapper-DLL für XP im Prog.-Verzeichnis natürlich vorher entfernt
Sorry, unter XP funktioniert es doch, beim fehlgeschlagenen Versuch unter XP befand sich eine Kopie der RasApi32-Wrapper-DLL für XP im Verzeichnis des getesteten Programms. Nach entfernen der Kopie und Reboot klappte es wieder
Debuggen im Disassmbly Mode (unter W2k und VS 6.0) bringt folgendes zutage:
Bis zur Wrapper-DLL
----------
5701BE58 jmp dword ptr ds:[57021990h]
5701BE5E ret
----------
--> Sprung jmp dword ptr ds:[57021990h] führt auf Adresse 00000000h
Ansonsten alles wie beim 1.Nachtrag.
D.H. der Inhalt von 57021990h und weiterer Stellen in der Umgebung ist 00000000h
Die RasApi32-Wrapper-DLL für XP im Prog.-Verzeichnis natürlich vorher entfernt
Nachtrag:
Prog. funktioniert nach Neustart des XP Rechners mit 190 Warner auch dort nicht mehr. Wieso es beim ersten Versuch funktioniert hat? Weis der Geier
Debuggen im Disassmbly Mode (unter XP und VS .NET 7.1) brachte folgendes zutage:
Bis zur Wrapper-DLL
----------
5701BE60 jmp dword ptr ds:[57021994h]
5701BE66 ret
----------
geht der Aufruf von RasEnumEntries gut.
Der Sprung jmp dword ptr ds:[57021994h]
führt auf Adresse 00000000h
Was kein Wunder ist, denn der Inhalt von 57021994h und weiterer Stellen in der Umgebung ist 00000000h.
Prog. funktioniert nach Neustart des XP Rechners mit 190 Warner auch dort nicht mehr. Wieso es beim ersten Versuch funktioniert hat? Weis der Geier
Debuggen im Disassmbly Mode (unter XP und VS .NET 7.1) brachte folgendes zutage:
Bis zur Wrapper-DLL
----------
5701BE60 jmp dword ptr ds:[57021994h]
5701BE66 ret
----------
geht der Aufruf von RasEnumEntries gut.
Der Sprung jmp dword ptr ds:[57021994h]
führt auf Adresse 00000000h
Was kein Wunder ist, denn der Inhalt von 57021994h und weiterer Stellen in der Umgebung ist 00000000h.
Beim Import der Funktion kann man eigentlich nichts falsch machen,Original von Mirko:
Wenn es ein eigenes ist, dann hast du was falsch gemacht beim Import der Funktion ...
Na dann schreib mal wie du die Funktion importierst ...
die Funktionen der RasApi32.dll werden statisch über RasApi32.lib (Visual Studio 6.0) gelinkt.
Auserdem:
Das Programm läuft fehlerfrei auf etlichen Kundenrechnern. Windows NT 4/2000/XP/2003 Server.
Auch auf dem XP Rechnern auf dem der 190 Warner installiert ist.
Nur auf Win2000 Rechnern auf denen der 190 Warner installiert ist führt der Aufruf von RasEnumEntries ins Nirwana.
--------------------------------------------------Original von Mirko:
... und wie du diese aufrufst.
DWORD cb; // size in bytes of buffer
DWORD cEntries; // Anzahl der Einträge
DWORD nRet;
TCHAR* pszPhonebook = NULL;
...
cb = sizeof(RASENTRYNAME);
lpRasEntryName = (LPRASENTRYNAME)GlobalAlloc(GPTR, cb);
lpRasEntryName->dwSize = sizeof(RASENTRYNAME);
/**/ if ((nRet = RasEnumEntries(NULL, pszPhonebook, lpRasEntryName, &cb, &cEntries))
== ERROR_BUFFER_TOO_SMALL)
{
GlobalFree(lpRasEntryName);
lpRasEntryName = (LPRASENTRYNAME)GlobalAlloc(GPTR, cb);
lpRasEntryName->dwSize = sizeof(RASENTRYNAME);
}
--------------------------------------------------
Der Aufruf ist nahezu identisch mit dem Beispiel in der Online Hilfe von VS 6.0.
Der obige Aufruf von RasEnumEntries dient der Ermittlung der benötigten Buffergröße für lpRasEntryName (ist versionsabhängig).
Zum eigentlichen Aufruf mit der passenden Buffergröße kommt es nicht mehr, der Absturz erfolgt bei /**/
Wenn es ein eigenes ist, dann hast du was falsch gemacht beim Import der Funktion, denn jedes Programm funktioniert, auch der 0190 Warner selbst verwendet diese Funktion, nur dein eigenes nicht. Na dann schreib mal wie du die Funktion importierst und wie du diese aufrufst. Ist zwar hier kein Programmierforum aber kann man mal Ausnahmsweise machen.
--
mirko
--
mirko
Sp2Original von Mirko:
Welches ServicePack??
Ein eigenes, sonst wäre die Sache mit dem Debuggen etwas schwierig gewordenOriginal von Mirko:
Und welche Anwendung verursacht das Problem?
Da ich exakt die fehlerhafte Funktion \'RasEnumEntriesA\' identifizieren konnte dürften obige Angaben irrelevant sein
Ja. Habe extra im Windows-Systemverzeichnis nachgesehen.Original von Mirko:
Steht in der Versionsinfo der Wrapper DLL auch für Win2000 drin?
Welches ServicePack?? Und welche Anwendung verursacht das Problem? Steht in der Versionsinfo der Wrapper DLL auch für Win2000 drin?
--
mirko
--
mirko
Zuletzt geändert von mirko am 20.10.2003, 22:14, insgesamt 1-mal geändert.
Hallo,
Seit Installation funktionieren einige Programme die die RasApi32.dll benitzen nicht mehr und stürzen ab.
Untersuchungen mit dem Debugger identifizierten die Funktion \"RasEnumEntriesA\" als Absturzursache. Offenbar arbeitet hier die RasApi32-Wrapper-DLL für W2k nicht korrekt.
Unter Windows XP tritt das Problem nicht auf. D.h. die RasApi32-Wrapper-DLL für XP arbeitet korrekt.
Kennt jemand eine Lösung für das Problem ?
Seit Installation funktionieren einige Programme die die RasApi32.dll benitzen nicht mehr und stürzen ab.
Untersuchungen mit dem Debugger identifizierten die Funktion \"RasEnumEntriesA\" als Absturzursache. Offenbar arbeitet hier die RasApi32-Wrapper-DLL für W2k nicht korrekt.
Unter Windows XP tritt das Problem nicht auf. D.h. die RasApi32-Wrapper-DLL für XP arbeitet korrekt.
Kennt jemand eine Lösung für das Problem ?