Importing a C++ function problems
BlitzMax Forums/BlitzMax Programming/Importing a C++ function problems
| ||
Hi, I have this C++ function:bool CreateDirectoryUserFullAccess(LPCTSTR lpPath) { int f = CreateDirectory(lpPath,NULL); if(!f) return false; HANDLE hDir = CreateFile(lpPath,READ_CONTROL|WRITE_DAC,0,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL); if(hDir == INVALID_HANDLE_VALUE) return true; ACL* pOldDACL=NULL; SECURITY_DESCRIPTOR* pSD = NULL; GetSecurityInfo(hDir,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,&pOldDACL,NULL,(void**)&pSD); EXPLICIT_ACCESS ea={0}; ea.grfAccessMode = GRANT_ACCESS; ea.grfAccessPermissions = GENERIC_ALL; ea.grfInheritance = CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE; ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP; ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME; ea.Trustee.ptstrName = TEXT("Users"); ACL* pNewDACL = NULL; SetEntriesInAcl(1,&ea,pOldDACL,&pNewDACL); SetSecurityInfo(hDir,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDACL,NULL); LocalFree(pSD); LocalFree(pNewDACL); CloseHandle(hDir); return true; } Save in a file called vista.cpp Then in Bmax I go: Strict Import "vista.cpp" But when I compile, I get a page full of errors like this: Compiling:vista.cpp C:/BlitzMax/Jake/demo/vista.cpp:1: `LPCTSTR' was not declared in this scope C:/BlitzMax/Jake/demo/vista.cpp:1: parse error before `)' token C:/BlitzMax/Jake/demo/vista.cpp: In function `bool CreateDirectoryUserFullAccess(...)': C:/BlitzMax/Jake/demo/vista.cpp:3: `lpPath' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:3: (Each undeclared identifier is reported only once for each function it appears in.) C:/BlitzMax/Jake/demo/vista.cpp:3: `NULL' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:3: `CreateDirectory' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:7: `HANDLE' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:7: parse error before `=' token C:/BlitzMax/Jake/demo/vista.cpp:8: `hDir' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:8: `INVALID_HANDLE_VALUE' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:11: `ACL' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:11: `pOldDACL' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:12: `SECURITY_DESCRIPTOR' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:12: `pSD' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:13: `SE_FILE_OBJECT' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:13: `DACL_SECURITY_INFORMATION' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:13: `GetSecurityInfo' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:15: `EXPLICIT_ACCESS' undeclared (first use this function) C:/BlitzMax/Jake/demo/vista.cpp:15: parse error before `=' token C:/BlitzMax/Jake/demo/vista.cpp: At global scope: C:/BlitzMax/Jake/demo/vista.cpp:16: syntax error before `.' token C:/BlitzMax/Jake/demo/vista.cpp:17: syntax error before `.' token C:/BlitzMax/Jake/demo/vista.cpp:18: syntax error before `.' token C:/BlitzMax/Jake/demo/vista.cpp:19: syntax error before `.' token C:/BlitzMax/Jake/demo/vista.cpp:20: syntax error before `.' token C:/BlitzMax/Jake/demo/vista.cpp:21: syntax error before `.' token C:/BlitzMax/Jake/demo/vista.cpp:23: syntax error before `*' token C:/BlitzMax/Jake/demo/vista.cpp:24: `ea' was not declared in this scope C:/BlitzMax/Jake/demo/vista.cpp:24: `pNewDACL' was not declared in this scope C:/BlitzMax/Jake/demo/vista.cpp:24: ISO C++ forbids declaration of ` SetEntriesInAcl' with no type C:/BlitzMax/Jake/demo/vista.cpp:24: initializer list being treated as compound expression C:/BlitzMax/Jake/demo/vista.cpp:26: `pNewDACL' was not declared in this scope C:/BlitzMax/Jake/demo/vista.cpp:26: ISO C++ forbids declaration of ` SetSecurityInfo' with no type C:/BlitzMax/Jake/demo/vista.cpp:26: initializer list being treated as compound expression C:/BlitzMax/Jake/demo/vista.cpp:28: ISO C++ forbids declaration of `LocalFree' with no type C:/BlitzMax/Jake/demo/vista.cpp:29: `pNewDACL' was not declared in this scope C:/BlitzMax/Jake/demo/vista.cpp:29: ISO C++ forbids declaration of `LocalFree' with no type C:/BlitzMax/Jake/demo/vista.cpp:29: redefinition of `int LocalFree' C:/BlitzMax/Jake/demo/vista.cpp:28: `int LocalFree' previously defined here C:/BlitzMax/Jake/demo/vista.cpp:30: ISO C++ forbids declaration of `CloseHandle ' with no type C:/BlitzMax/Jake/demo/vista.cpp:31: parse error before `return' Build Error: failed to compile C:/BlitzMax/Jake/demo/vista.cpp I've NO idea where to start. I must be doing something really basic wrong. Any ideas? Thanks. Oh an dI tried saving the file as .c and importing that but got similar errors. |
| ||
Your c file is including the headers right? Try putting '#include <windows.h>' at the top in the c file. |
| ||
That helped thanks and I found some other things I needed to include. It still doesn't compile though. Some other errors I may post soon... |
| ||
OK cool, so I added these three:#include <windows.h> #include "accctrl.h" #include "aclapi.h" to the top and now I only get these errors: C:/BlitzMax/Jake/demo/.bmx/vista.cpp.release.win32.x86.o(.text+0x71):vista.cpp: undefined reference to `GetSecurityInfo@32' C:/BlitzMax/Jake/demo/.bmx/vista.cpp.release.win32.x86.o(.text+0xbe):vista.cpp: undefined reference to `SetEntriesInAclA@16' C:/BlitzMax/Jake/demo/.bmx/vista.cpp.release.win32.x86.o(.text+0xd1):vista.cpp: undefined reference to `SetSecurityInfo@28' Those three are declared in Aclapi.h so I don't understand why it won't find them. They all have the correct parameters... |
| ||
I even tried compiling this code straight off of MSDN, unaltered: and I get: C:/BlitzMax/Jake/demo/.bmx/vista2.cpp.console.release.win32.x86.o(.text+0x130):vista2.cpp: undefined reference to `GetSecurityInfo@32' C:/BlitzMax/Jake/demo/.bmx/vista2.cpp.console.release.win32.x86.o(.text+0x167):vista2.cpp: undefined reference to `LookupAccountSidA@28' C:/BlitzMax/Jake/demo/.bmx/vista2.cpp.console.release.win32.x86.o(.text+0x19c):vista2.cpp: undefined reference to `LookupAccountSidA@28' This should work. Any idea why not? It's weird... |
| ||
greetings :) try this: dir_func.cpp #include <windows.h> #include <aclapi.h> extern "C" bool CreateDirectoryUserFullAccess(LPCTSTR lpPath) { int f = CreateDirectory(lpPath,NULL); if(!f) return false; HANDLE hDir = CreateFile(lpPath,READ_CONTROL|WRITE_DAC,0,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL); if(hDir == INVALID_HANDLE_VALUE) return true; ACL* pOldDACL=NULL; SECURITY_DESCRIPTOR* pSD = NULL; GetSecurityInfo(hDir,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,&pOldDACL,NULL,&pSD); EXPLICIT_ACCESS ea={0}; ea.grfAccessMode = GRANT_ACCESS; ea.grfAccessPermissions = GENERIC_ALL; ea.grfInheritance = CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE; ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP; ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME; ea.Trustee.ptstrName = TEXT("Users"); ACL* pNewDACL = NULL; SetEntriesInAcl(1,&ea,pOldDACL,&pNewDACL); SetSecurityInfo(hDir,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDACL,NULL); LocalFree(pSD); LocalFree(pNewDACL); CloseHandle(hDir); return true; } dir_func.bmx Framework BRL.Blitz Import "dir_func.cpp" Import "-ladvapi32" DebugLog(CreateDirectoryUserFullAccess("c:\temp\testdirectory")) Extern Function CreateDirectoryUserFullAccess:Int(lpPath$z) EndExtern |
| ||
Thanks gman, whatever jiggery pokery you did, it compiles, woo. I shall be trying this out on Vista tomorrow. I'll post back my results. Well I couldn't sleep so I tried it anyway and IT TOTALLY WORKS. So we now have a valid solution for storing shared highscores and data on Vista! Thanks GMan, you are my hero! |
| ||
hero? lol. just drop me a virtual beer sometime :) very glad i could be of assistace. keep up the great work! it was a nice little break from my current project :) |
| ||
You found the problem with the (void**) then, I found that too. No idea why Indiepath put that in there. |
| ||
You found the problem with the (void**) then, I found that too. No idea why Indiepath put that in there. It's common practice when dealing with Security Descriptors - don't ask me why but every example I have come across uses it. |
| ||
It just didn't compile with it for some reason. |