use of com.sun.jna.Pointer in project jna by java-native-access.
the class COMInvoker method _invokeNativeObject.
protected Object _invokeNativeObject(int vtableId, Object[] args, Class<?> returnType) {
Pointer vptr = this.getPointer().getPointer(0);
// we take the vtable id and multiply with the pointer size (4 bytes on
// 32bit OS)
Function func = Function.getFunction(vptr.getPointer(vtableId * Pointer.SIZE));
return func.invoke(returnType, args);
}
use of com.sun.jna.Pointer in project jna by java-native-access.
the class Moniker method GetDisplayName.
@Override
public String GetDisplayName(Pointer pbc, Pointer pmkToLeft) {
final int vTableId = vTableIdStart + 13;
PointerByReference ppszDisplayNameRef = new PointerByReference();
WinNT.HRESULT hr = (WinNT.HRESULT) this._invokeNativeObject(vTableId, new Object[] { this.getPointer(), pbc, pmkToLeft, ppszDisplayNameRef }, WinNT.HRESULT.class);
COMUtils.checkRC(hr);
Pointer ppszDisplayName = ppszDisplayNameRef.getValue();
if (ppszDisplayName == null) {
return null;
}
WTypes.LPOLESTR oleStr = new WTypes.LPOLESTR(ppszDisplayName);
String name = oleStr.getValue();
Ole32.INSTANCE.CoTaskMemFree(ppszDisplayName);
return name;
}
use of com.sun.jna.Pointer in project jna by java-native-access.
the class Advapi32Util method backupEncryptedFile.
/**
* Backup an encrypted file or folder without decrypting it. A file named
* "bar/sample.text" will be backed-up to "destDir/sample.text". A directory
* named "bar" will be backed-up to "destDir/bar". This method is NOT
* recursive. If you have an encrypted directory with encrypted files, this
* method must be called once for the directory, and once for each encrypted
* file to be backed-up.
*
* @param src
* The encrypted file or directory to backup.
* @param destDir
* The directory where the backup will be saved.
*/
public static void backupEncryptedFile(File src, File destDir) {
if (!destDir.isDirectory()) {
throw new IllegalArgumentException("destDir must be a directory.");
}
// Open the file for export (backup)
ULONG readFlag = new ULONG(0);
// Import (restore) file
ULONG writeFlag = new ULONG(CREATE_FOR_IMPORT);
if (src.isDirectory()) {
writeFlag.setValue(CREATE_FOR_IMPORT | CREATE_FOR_DIR);
}
// open encrypted file for export
String srcFileName = src.getAbsolutePath();
PointerByReference pvContext = new PointerByReference();
if (Advapi32.INSTANCE.OpenEncryptedFileRaw(srcFileName, readFlag, pvContext) != W32Errors.ERROR_SUCCESS) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
// read encrypted file
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
FE_EXPORT_FUNC pfExportCallback = new FE_EXPORT_FUNC() {
@Override
public DWORD callback(Pointer pbData, Pointer pvCallbackContext, ULONG ulLength) {
byte[] arr = pbData.getByteArray(0, ulLength.intValue());
try {
outputStream.write(arr);
} catch (IOException e) {
throw new RuntimeException(e);
}
return new DWORD(W32Errors.ERROR_SUCCESS);
}
};
if (Advapi32.INSTANCE.ReadEncryptedFileRaw(pfExportCallback, null, pvContext.getValue()) != W32Errors.ERROR_SUCCESS) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
// close
try {
outputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
Advapi32.INSTANCE.CloseEncryptedFileRaw(pvContext.getValue());
// open file for import
String destFileName = destDir.getAbsolutePath() + File.separator + src.getName();
pvContext = new PointerByReference();
if (Advapi32.INSTANCE.OpenEncryptedFileRaw(destFileName, writeFlag, pvContext) != W32Errors.ERROR_SUCCESS) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
// write encrypted file
final IntByReference elementsReadWrapper = new IntByReference(0);
FE_IMPORT_FUNC pfImportCallback = new FE_IMPORT_FUNC() {
@Override
public DWORD callback(Pointer pbData, Pointer pvCallbackContext, ULONGByReference ulLength) {
int elementsRead = elementsReadWrapper.getValue();
int remainingElements = outputStream.size() - elementsRead;
int length = Math.min(remainingElements, ulLength.getValue().intValue());
pbData.write(0, outputStream.toByteArray(), elementsRead, length);
elementsReadWrapper.setValue(elementsRead + length);
ulLength.setValue(new ULONG(length));
return new DWORD(W32Errors.ERROR_SUCCESS);
}
};
if (Advapi32.INSTANCE.WriteEncryptedFileRaw(pfImportCallback, null, pvContext.getValue()) != W32Errors.ERROR_SUCCESS) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
// close
Advapi32.INSTANCE.CloseEncryptedFileRaw(pvContext.getValue());
}
use of com.sun.jna.Pointer in project jna by java-native-access.
the class DdemlTest method testMemoryHandling.
@Test
public void testMemoryHandling() {
DdeCallback callback = new Ddeml.DdeCallback() {
public WinDef.PVOID ddeCallback(int wType, int wFmt, Ddeml.HCONV hConv, Ddeml.HSZ hsz1, Ddeml.HSZ hsz2, Ddeml.HDDEDATA hData, BaseTSD.ULONG_PTR lData1, BaseTSD.ULONG_PTR lData2) {
return new PVOID();
}
};
DWORDByReference pidInst = new DWORDByReference();
int initResult = Ddeml.INSTANCE.DdeInitialize(pidInst, callback, Ddeml.APPCMD_CLIENTONLY, 0);
assertEquals(Ddeml.DMLERR_NO_ERROR, initResult);
// Acquire dummy handle
HSZ hsz = Ddeml.INSTANCE.DdeCreateStringHandle(pidInst.getValue().intValue(), "Dummy", Ddeml.CP_WINUNICODE);
String testStringPart1 = "Hallo ";
String testStringPart2 = "Welt";
// Create Handle
// String in DDE can not exceed 255 Chars
Memory mem = new Memory(256 * 2);
mem.setWideString(0, testStringPart1);
HDDEDATA data = Ddeml.INSTANCE.DdeCreateDataHandle(pidInst.getValue().intValue(), mem, testStringPart1.length() * 2, 0, hsz, WinUser.CF_UNICODETEXT, Ddeml.HDATA_APPOWNED);
mem.setWideString(0, testStringPart2);
Ddeml.INSTANCE.DdeAddData(data, mem, (testStringPart2.length() + 1) * 2, testStringPart1.length() * 2);
DWORDByReference dataSize = new DWORDByReference();
Pointer resultPointer = Ddeml.INSTANCE.DdeAccessData(data, dataSize);
assertEquals((testStringPart1.length() + testStringPart2.length() + 1) * 2, dataSize.getValue().intValue());
assertEquals(testStringPart1 + testStringPart2, resultPointer.getWideString(0));
boolean result = Ddeml.INSTANCE.DdeUnaccessData(data);
int readSize = Ddeml.INSTANCE.DdeGetData(data, mem, (int) mem.size(), 0);
assertEquals((testStringPart1.length() + testStringPart2.length() + 1) * 2, readSize);
assertEquals(testStringPart1 + testStringPart2, mem.getWideString(0));
assertTrue(result);
result = Ddeml.INSTANCE.DdeFreeDataHandle(data);
assertTrue(result);
synchronized (mem) {
}
result = Ddeml.INSTANCE.DdeUninitialize(pidInst.getValue().intValue());
assertTrue(result);
}
use of com.sun.jna.Pointer in project jna by java-native-access.
the class DdemlUtilTest method testExecute.
@Test
public void testExecute() throws InterruptedException {
final String serviceName = "TestService";
final String topicName = "TestTopic";
final String testExecute = "Execute�������";
final CountDownLatch executeReceived = new CountDownLatch(1);
StandaloneDdeClient client = null;
StandaloneDdeClient server = null;
try {
client = new StandaloneDdeClient() {
{
this.initialize(Ddeml.APPCMD_CLIENTONLY | Ddeml.CBF_SKIP_REGISTRATIONS | Ddeml.CBF_SKIP_UNREGISTRATIONS);
}
};
server = new StandaloneDdeClient() {
private final ConnectHandler connectHandler = new ConnectHandler() {
public boolean onConnect(int transactionType, HSZ topic, HSZ service, Ddeml.CONVCONTEXT convcontext, boolean sameInstance) {
return topicName.equals(queryString(topic));
}
};
private final ExecuteHandler executeHandler = new ExecuteHandler() {
public int onExecute(int transactionType, HCONV hconv, HSZ topic, Ddeml.HDDEDATA commandStringData) {
Pointer[] pointer = new Pointer[] { accessData(commandStringData, null) };
try {
String commandString = pointer[0].getWideString(0);
if (testExecute.equals(commandString) && queryString(topic).equals(topicName)) {
executeReceived.countDown();
return Ddeml.DDE_FACK;
}
} finally {
synchronized (pointer) {
unaccessData(commandStringData);
}
}
return Ddeml.DDE_FNOTPROCESSED;
}
};
{
registerConnectHandler(connectHandler);
registerExecuteHandler(executeHandler);
this.initialize(Ddeml.APPCMD_FILTERINITS | Ddeml.CBF_SKIP_ALLNOTIFICATIONS);
}
};
server.nameService(serviceName, Ddeml.DNS_REGISTER);
IDdeConnection con = client.connect(serviceName, topicName, null);
con.execute(testExecute, 5 * 1000, null, null);
assertTrue(executeReceived.await(5, TimeUnit.SECONDS));
} finally {
closeQuitely(client);
closeQuitely(server);
}
}
Aggregations