Прежде всего, я не Java-разработчик, и я не тестировал приведенный ниже код, но я понимаю WM_COPYDATA, поэтому могу дать разумный ответ на ваш вопрос.
Сообщение WM_COPYDATA отправляет указатель на (то есть адрес) COPYDATASTRUCT , который определяется Windows как:
struct COPYDATASTRUCT {
ULONG_PTR dwData;
DWORD cbData;
PVOID lpData;
}
Из Java вам придется читать это вручную, используя методы sun.misc.Unsafe class . Под ручным я имею в виду, что вам придется самостоятельно вычислять адреса памяти.
dwData
- это целочисленное значение, которое приложение может использовать для себя. lpData
- указатель на буфер, содержащий данные, которые приложение хотело передать. cbData
- это количество байтов в буфере, которое содержит lpData
.
В Windows ULONG_PTR
составляет 4 байта в 32-битной системе и 8 байтов в 64-битной системе. DWORD
всегда 4 байта. PVOID, который является указателем (то есть адресом памяти), составляет 4 байта в 32-битной системе и 8 байтов в 64-битной системе.
Таким образом, в 32-битной системе dwData
со смещением 0, cbData
со смещением 4 и lpData
со смещением 8. В 64-битной системе dwData
по-прежнему со смещением 0, но cbData
по смещению 8 и lpData
по смещению 16.
import sun.misc;
final int dwDataOffset = 0;
final int cbDataOffset = 4; // Change to 8 for 64 bit
final int lpDataOffset = 8; // Change to 16 for 64 bit
int cpDataAddr = this._pData.getValue(); // This will return the address of the struct (I assume this syntax is correct) - change to long for 64 bit
int messageCode= Unsafe.getInt(cpDataAddr+dwDataOffset); // Change to getLong for 64 bit
int dataSize = Unsafe.getInt(cbDataAddr+cbDataOffset);
int dataAddress = Unsafe.GetInt(cbDataAddr+lpDataOffset); // Change to getLong for 64 bit
// Create a buffer to hold the data from lpData
byte[] data = new byte[dataSize];
for (int i = 0; i < dataSize; i++)
data[i] = Unsafe.getByte(dataAddress+i);
Как только ваши готовые данные будут содержать необработанные данные, переданные приложением, что в вашем случае является лицензией. Если лицензия является строкой, вы должны быть в состоянии передать байтовый массив конструктору String. Если это более сложная структура данных, вам придется читать ее, используя методы Unsafe
, как мы это делали для COPYDATASTRUCT