![]() |
ungültige Zeigerposition - Was heißt das?
Hi,
ich habe eine DLL Programmiert und sie in mein Programm eingebunden. Das ist alles nur ein Test, da ich eben erst mit der DLL Programmierung angefangen habe. Das sind die "Test"-Codes: DLL-Code:
Delphi-Quellcode:
HauptProgramm:
function GetWinVersion: string; stdcall;
var osvi : TOSVersionInfo; bOsVersionInfoEx : boolean; key : HKEY; szProductType : array[0..79]of char; dwBuflen : dword; begin // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(@osvi,sizeof(TOSVersionInfo)); osvi.dwOSVersionInfoSize := sizeof(TOSVersionInfo); bOsVersionInfoEx := GetVersionEx(osvi); if(not bOsVersionInfoEx) then begin osvi.dwOSVersionInfoSize := VERSIONINFOSIZE; if(not GetVersionEx(osvi)) then begin Result := 'Fehler bei der Ermittlung der Windows-Version'; exit; end; end; case osvi.dwPlatformId of // Test for the Windows NT product family. VER_PLATFORM_WIN32_NT: begin // Test for the specific product family. if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 2) then Result := 'Microsoft Windows Server 2003 family, '; if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 1) then Result := 'Microsoft Windows XP '; if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 0) then Result := 'Microsoft Windows 2000 '; if(osvi.dwMajorVersion <= 4) then Result := 'Microsoft Windows NT '; // Test for specific product on Windows NT 4.0 SP6 and later. if(bOsVersionInfoEx) then begin // Test for the workstation type. if(osvi.wProductType = VER_NT_WORKSTATION) then begin if(osvi.dwMajorVersion = 4) then Result := Result + 'Workstation 4.0 ' else if(osvi.wSuiteMask and VER_SUITE_PERSONAL <> 0) then Result := Result + 'Home Edition ' else Result := Result + 'Professional '; end // Test for the server type. else if(osvi.wProductType = VER_NT_SERVER) then begin if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 2) then begin // Win 2003 if(osvi.wSuiteMask and VER_SUITE_DATACENTER <> 0) then Result := Result + 'Datacenter Edition ' else if(osvi.wSuiteMask and VER_SUITE_ENTERPRISE <> 0) then Result := Result + 'Enterprise Edition ' else if(osvi.wSuiteMask = VER_SUITE_BLADE) then Result := Result + 'Web Edition ' else Result := Result + 'Standard Edition '; end // Win 2000 else if(osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 0) then begin if(osvi.wSuiteMask and VER_SUITE_DATACENTER <> 0) then Result := Result + 'Datacenter Server ' else if(osvi.wSuiteMask and VER_SUITE_ENTERPRISE <> 0) then Result := Result + 'Advanced Server ' else Result := Result + 'Server '; end else begin // Windows NT 4.0 if(osvi.wSuiteMask and VER_SUITE_ENTERPRISE <> 0) then Result := Result + 'Server 4.0, Enterprise Edition ' else Result := Result + 'Server 4.0 '; end; end end // Test for specific product on Windows NT 4.0 SP5 and earlier else begin dwBufLen := sizeof(szProductType); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\ProductOptions',0, KEY_QUERY_VALUE,key) = ERROR_SUCCESS) then try ZeroMemory(@szProductType,sizeof(szProductType)); if(RegQueryValueEx(key,'ProductType',nil,nil, @szProductType,@dwBufLen) <> ERROR_SUCCESS) or (dwBufLen > sizeof(szProductType)) then ZeroMemory(@szProductType,sizeof(szProductType)); finally RegCloseKey(key); end; if(lstrcmpi('WINNT',szProductType) = 0) then Result := Result + 'Workstation '; if(lstrcmpi('LANMANNT',szProductType) = 0) then Result := Result + 'Server '; if(lstrcmpi('SERVERNT',szProductType) = 0) then Result := Result + 'Advanced Server '; Result := Format('%s%d.%d',[Result,osvi.dwMajorVersion, osvi.dwMinorVersion]); end; // Display service pack (if any) and build number. if(osvi.dwMajorVersion = 4) and (lstrcmpi(osvi.szCSDVersion,'Service Pack 6') = 0) then begin // Test for SP6 versus SP6a. if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\Q246009', 0,KEY_QUERY_VALUE,key) = ERROR_SUCCESS) then Result := Format('%sService Pack 6a (Build %d)',[Result, osvi.dwBuildNumber and $ffff]) else // Windows NT 4.0 prior to SP6a Result := Format('%s%s (Build %d)',[Result, osvi.szCSDVersion,osvi.dwBuildNumber and $ffff]); RegCloseKey(key); end // Windows NT 3.51 and earlier or Windows 2000 and later else begin Result := Format('%s%s (Build %d)',[Result, osvi.szCSDVersion,osvi.dwBuildNumber and $ffff]); end; end; // Test for the Windows 95 product family. VER_PLATFORM_WIN32_WINDOWS: begin if(osvi.dwMajorVersion = 4) and (osvi.dwMinorVersion = 0) then begin Result := 'Microsoft Windows 95 '; if(osvi.szCSDVersion[0] = 'C') or (osvi.szCSDVersion[0] = 'B') then Result := Result + 'OSR2 '; end; if(osvi.dwMajorVersion = 4) and (osvi.dwMinorVersion = 10) then begin Result := 'Microsoft Windows 98 '; if(osvi.szCSDVersion[0] = 'A') then Result:= Result + 'SE '; end; if(osvi.dwMajorVersion = 4) and (osvi.dwMinorVersion = 90) then begin Result := 'Microsoft Windows Millennium Edition'; end; end; VER_PLATFORM_WIN32s: Result := 'Microsoft Win32s'; end; end; exports GetWinVersion; begin end.
Delphi-Quellcode:
implementation
{$R *.dfm} function GetWinVersion:string; stdcall; external 'test.dll'; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.add(GetWinVersion); end; end. So, das soll mit einfach nur in Memo1 mein Betriebssystem eintaragen. Doch die Meldung "Ungültige Zeigerposition" erscheint. Er führt den Befehl aber trotzdem richtig aus. Auch bei einem anderen Code kommt diese Meldung... Was heißt das? Bye DJ-SPM |
Re: ungültige Zeigerposition - Was heißt das?
Willst du Strings aus einer DLL zurückgeben musst du die Unit ShareMem als aller erste in der DLL und im Programm angeben. Siehe dazu auch das Tutorial von Assarbad zu DLL's auf meiner Seite:
![]() |
Re: ungültige Zeigerposition - Was heißt das?
Achso,
das meinten die mit dem Hinweis ShareMem in geschweiften Klammern. Wenn ich das also machen, was hat das für Nachteile? |
Re: ungültige Zeigerposition - Was heißt das?
Du musst halt immer noch die BORLANDMM.DLL oder wie die heißt mit deiner Anwendung mitgeben.
Du kannst das aber ganz einfach umgenen, indem du einfach PChar statt String verwendest, kann man ja ganz einfach umwandeln ;-) |
Re: ungültige Zeigerposition - Was heißt das?
Es gibt auch einen Weg, mit dem es ohne die ShareMem funktioniert:
Benutze keine Strings, sondern PChars. BtW: Das steht auch in der OH. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz