13:48

Тотальная неудачница и убийца жёстких дисков.
//===================================================================
// ВНИМАНИЕ!!!!
//
// В функции вроде SysReAllocString() передавать BSTR нужно
// внимательно, поскольку функции принимают OLECHAR, а не BSTR,
// тоесть ДО ПЕРВОГО НУЛЯ. Поэтому следует использовать
// SysReAllocLen()!!!
//
// Также можно использовать мои
// SysReAllocStringBSTR() и SysAllocStringBSTR().
//===================================================================

#include
#include
#include

//#pragma INSERT IGNORE_AJP_ID

// Эти макросы возврщают булево значение...
#define RETURN_FALSE {*RetVal = VBFalse; return S_FALSE;}
#define RETURN_TRUE {*RetVal = VBTrue; return S_OK;}

// Этот макрос возвращает пустую строку...
#define RETURN_EMPTY_STRING { SysReAllocString(RetVal, L"\0"); \
return S_OK; }








// Мой вариант структуры...
typedef struct AS_MEMORY_STATUS {
DWORD MemoryLoadPercent;
DWORD Padding;
double TotalPhysical;
double AvailPhysical;
double TotalPageFile;
double AvailPageFile;
double TotalVirtual;
double AvailVirtual;
double AvailExtendedVirtual;
} AS_MEMORY_STATUS;

// Официальная структура...
typedef struct _MEMORYSTATUSEX {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORDLONG ullTotalPhys;
DWORDLONG ullAvailPhys;
DWORDLONG ullTotalPageFile;
DWORDLONG ullAvailPageFile;
DWORDLONG ullTotalVirtual;
DWORDLONG ullAvailVirtual;
DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

typedef BOOL (WINAPI *GLOBALMEMORYSTATUSEX)(LPMEMORYSTATUSEX lpBuffer);

inline double DwordLongToDouble(DWORDLONG Value);
HRESULT GlobalMemoryStatusBase(AS_MEMORY_STATUS *MemStat);

//===================================================================
// Эта функция пытается прочитать сведения о памяти как со старой
// функцией так и с новой, если она доступна. Очень полезно на
// машинах, где много памяти...
//===================================================================
EXP_AJPAPI(HRESULT) asGlobalMemoryStatus(AS_MEMORY_STATUS *MemStat)
{
if (MemStat == NULL) return E_INVALIDARG;

// Obtain the module handle of the kernel.
HMODULE hKernel = GetModuleHandle("KERNEL32");
if (!hKernel) return GlobalMemoryStatusBase(MemStat);

// Теперь вытаскиваем функцию. Терпеть не могу это >_<
GLOBALMEMORYSTATUSEX GlobalMemoryStatusEx = (GLOBALMEMORYSTATUSEX)GetProcAddress(hKernel, "GlobalMemoryStatusEx");
if (GlobalMemoryStatusEx == NULL) return GlobalMemoryStatusBase(MemStat);

// Теперь пробуем вызвать улучшенную функцию...
MEMORYSTATUSEX MSEX;

MSEX.dwLength = sizeof(MSEX);
if (GlobalMemoryStatusEx(&MSEX) == FALSE) return GlobalMemoryStatusBase(MemStat);

MemStat->MemoryLoadPercent = (DWORD)MSEX.dwMemoryLoad;
MemStat->TotalPhysical = DwordLongToDouble(MSEX.ullTotalPhys);
MemStat->AvailPhysical = DwordLongToDouble(MSEX.ullAvailPhys);
MemStat->TotalPageFile = DwordLongToDouble(MSEX.ullTotalPageFile);
MemStat->AvailPageFile = DwordLongToDouble(MSEX.ullAvailPageFile);
MemStat->TotalVirtual = DwordLongToDouble(MSEX.ullTotalVirtual);
MemStat->AvailVirtual = DwordLongToDouble(MSEX.ullAvailVirtual);
MemStat->AvailExtendedVirtual = DwordLongToDouble(MSEX.ullAvailExtendedVirtual);

return S_OK;
}

inline double DwordLongToDouble(DWORDLONG Value)
{
return (double)(signed __int64)Value;
}

// Здесь мы пробуем базовую функцию, если новая не доступна...
HRESULT GlobalMemoryStatusBase(AS_MEMORY_STATUS *MemStat)
{
MEMORYSTATUS MS;

MS.dwLength = sizeof(MS);
GlobalMemoryStatus(&MS);

MemStat->MemoryLoadPercent = (DWORD)MS.dwMemoryLoad;
MemStat->TotalPhysical = (double)MS.dwTotalPhys;
MemStat->AvailPhysical = (double)MS.dwAvailPhys;
MemStat->TotalPageFile = (double)MS.dwTotalPageFile;
MemStat->AvailPageFile = (double)MS.dwAvailPageFile;
MemStat->TotalVirtual = (double)MS.dwTotalVirtual;
MemStat->AvailVirtual = (double)MS.dwAvailVirtual;
MemStat->AvailExtendedVirtual = 0;

return S_OK;
}

//===================================================================
typedef BOOL (WINAPI *ISWOW64PROCESS) (HANDLE hProcess, BOOL *lpWOW64);

//===================================================================
EXP_AJPAPI(HRESULT) asIsHostWin64(VARIANT_BOOL *RetVal)
{
// Если компилируется как Win64 библиотека, то и искать нечего...
#ifdef _WIN64
CHECK_RETVAL;
RETURN_TRUE;

// А в обратном случае будет хитрость...
#else
CHECK_RETVAL;

HMODULE hKernel = GetModuleHandle("KERNEL32");
if (!hKernel) RETURN_FALSE;

ISWOW64PROCESS IsWow64Process = (ISWOW64PROCESS)GetProcAddress(hKernel, "IsWow64Process");
if (IsWow64Process == NULL) RETURN_FALSE;

BOOL bIsWow64 = FALSE;
BOOL RC = IsWow64Process(GetCurrentProcess(), &bIsWow64);

if (!RC) RETURN_FALSE;
if (!bIsWow64) RETURN_FALSE;
RETURN_TRUE;
#endif
}


Комментарии
27.02.2009 в 13:49

Тотальная неудачница и убийца жёстких дисков.
//===================================================================
// ВНИМАНИЕ!!!!
//
// В функции вроде SysReAllocString() передавать BSTR нужно
// внимательно, поскольку функции принимают OLECHAR, а не BSTR,
// тоесть ДО ПЕРВОГО НУЛЯ. Поэтому следует использовать
// SysReAllocLen()!!!
//
// Также можно использовать мои
// SysReAllocStringBSTR() и SysAllocStringBSTR().
//===================================================================

#include
#include
#include

//#pragma INSERT IGNORE_AJP_ID

// Эти макросы возврщают булево значение...
#define RETURN_FALSE {*RetVal = VBFalse; return S_FALSE;}
#define RETURN_TRUE {*RetVal = VBTrue; return S_OK;}

// Этот макрос возвращает пустую строку...
#define RETURN_EMPTY_STRING { SysReAllocString(RetVal, L"\0"); \
return S_OK; }








// Мой вариант структуры...
typedef struct AS_MEMORY_STATUS {
DWORD MemoryLoadPercent;
DWORD Padding;
double TotalPhysical;
double AvailPhysical;
double TotalPageFile;
double AvailPageFile;
double TotalVirtual;
double AvailVirtual;
double AvailExtendedVirtual;
} AS_MEMORY_STATUS;

// Официальная структура...
typedef struct _MEMORYSTATUSEX {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORDLONG ullTotalPhys;
DWORDLONG ullAvailPhys;
DWORDLONG ullTotalPageFile;
DWORDLONG ullAvailPageFile;
DWORDLONG ullTotalVirtual;
DWORDLONG ullAvailVirtual;
DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

typedef BOOL (WINAPI *GLOBALMEMORYSTATUSEX)(LPMEMORYSTATUSEX lpBuffer);

inline double DwordLongToDouble(DWORDLONG Value);
HRESULT GlobalMemoryStatusBase(AS_MEMORY_STATUS *MemStat);

//===================================================================
// Эта функция пытается прочитать сведения о памяти как со старой
// функцией так и с новой, если она доступна. Очень полезно на
// машинах, где много памяти...
//===================================================================
EXP_AJPAPI(HRESULT) asGlobalMemoryStatus(AS_MEMORY_STATUS *MemStat)
{
if (MemStat == NULL) return E_INVALIDARG;

// Obtain the module handle of the kernel.
HMODULE hKernel = GetModuleHandle("KERNEL32");
if (!hKernel) return GlobalMemoryStatusBase(MemStat);

// Теперь вытаскиваем функцию. Терпеть не могу это >_<
GLOBALMEMORYSTATUSEX GlobalMemoryStatusEx = (GLOBALMEMORYSTATUSEX)GetProcAddress(hKernel, "GlobalMemoryStatusEx");
if (GlobalMemoryStatusEx == NULL) return GlobalMemoryStatusBase(MemStat);

// Теперь пробуем вызвать улучшенную функцию...
MEMORYSTATUSEX MSEX;

MSEX.dwLength = sizeof(MSEX);
if (GlobalMemoryStatusEx(&MSEX) == FALSE) return GlobalMemoryStatusBase(MemStat);

MemStat->MemoryLoadPercent = (DWORD)MSEX.dwMemoryLoad;
MemStat->TotalPhysical = DwordLongToDouble(MSEX.ullTotalPhys);
MemStat->AvailPhysical = DwordLongToDouble(MSEX.ullAvailPhys);
MemStat->TotalPageFile = DwordLongToDouble(MSEX.ullTotalPageFile);
MemStat->AvailPageFile = DwordLongToDouble(MSEX.ullAvailPageFile);
MemStat->TotalVirtual = DwordLongToDouble(MSEX.ullTotalVirtual);
MemStat->AvailVirtual = DwordLongToDouble(MSEX.ullAvailVirtual);
MemStat->AvailExtendedVirtual = DwordLongToDouble(MSEX.ullAvailExtendedVirtual);

return S_OK;
}

inline double DwordLongToDouble(DWORDLONG Value)
{
return (double)(signed __int64)Value;
}

// Здесь мы пробуем базовую функцию, если новая не доступна...
HRESULT GlobalMemoryStatusBase(AS_MEMORY_STATUS *MemStat)
{
MEMORYSTATUS MS;

MS.dwLength = sizeof(MS);
GlobalMemoryStatus(&MS);

MemStat->MemoryLoadPercent = (DWORD)MS.dwMemoryLoad;
MemStat->TotalPhysical = (double)MS.dwTotalPhys;
MemStat->AvailPhysical = (double)MS.dwAvailPhys;
MemStat->TotalPageFile = (double)MS.dwTotalPageFile;
MemStat->AvailPageFile = (double)MS.dwAvailPageFile;
MemStat->TotalVirtual = (double)MS.dwTotalVirtual;
MemStat->AvailVirtual = (double)MS.dwAvailVirtual;
MemStat->AvailExtendedVirtual = 0;

return S_OK;
}

//===================================================================
typedef BOOL (WINAPI *ISWOW64PROCESS) (HANDLE hProcess, BOOL *lpWOW64);

//===================================================================
EXP_AJPAPI(HRESULT) asIsHostWin64(VARIANT_BOOL *RetVal)
{
// Если компилируется как Win64 библиотека, то и искать нечего...
#ifdef _WIN64
CHECK_RETVAL;
RETURN_TRUE;

// А в обратном случае будет хитрость...
#else
CHECK_RETVAL;

HMODULE hKernel = GetModuleHandle("KERNEL32");
if (!hKernel) RETURN_FALSE;

ISWOW64PROCESS IsWow64Process = (ISWOW64PROCESS)GetProcAddress(hKernel, "IsWow64Process");
if (IsWow64Process == NULL) RETURN_FALSE;

BOOL bIsWow64 = FALSE;
BOOL RC = IsWow64Process(GetCurrentProcess(), &bIsWow64);

if (!RC) RETURN_FALSE;
if (!bIsWow64) RETURN_FALSE;
RETURN_TRUE;
#endif
}

27.02.2009 в 13:50

Тотальная неудачница и убийца жёстких дисков.
//===================================================================
// AJPapps - AJP API type library 1.00
//===================================================================

[
uuid(1ED8BAC1-A676-4229-9907-E5252B1AEA91),
version(1.0),
helpstring("AJPapps - C++ test type library 1.00")
]
library CPPTestTypeLibrary
{
#define EXP_AJPAPI(type) type __stdcall
#define BYTE unsigned char
#define VARIANT_BOOL BOOLEAN
#define DWORD long
#define COLORREF long
#define HPALETTE long
#define HDC long

//=================================================================
// TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("StdOLE2.TLB");

typedef struct AS_MEMORY_STATUS {
DWORD MemoryLoadPercent;
DWORD Padding;
double TotalPhysical;
double AvailPhysical;
double TotalPageFile;
double AvailPageFile;
double TotalVirtual;
double AvailVirtual;
double AvailExtendedVirtual;
} AS_MEMORY_STATUS;

//=================================================================
[dllname("..\Output\IsBuffersEqualTest.DLL")]
module IsBuffersEqualTest_DLL_Functions {

[entry("asGlobalMemoryStatus"), helpstring("...")]
EXP_AJPAPI(HRESULT) asGlobalMemoryStatus([in, out] AS_MEMORY_STATUS *MemStat);

[entry("asIsHostWin64"), helpstring("...")]
EXP_AJPAPI(HRESULT) asIsHostWin64([out, retval] VARIANT_BOOL *RetVal);

}

}

27.02.2009 в 13:50

Тотальная неудачница и убийца жёстких дисков.

74 4276 57426 75462375 64327 65472365 74236 754236 75642378
72436578 642379865 4295 97849423679 85
4854 32965742 35 87432597423y 95784298 57894327 589432
&lgt;B>23453254235</b>
4385483295y 879432 8594 8574328 754893275 843275 8942375
7 4326578924385748 32758423 7584327 58427358 724857 4
42395 89432758 4237584278574328 74803275 894203

Расширенная форма

Редактировать

Подписаться на новые комментарии