Неявное подключение и использование динамических библиотек (dll)

Для того, чтобы можно было пользоваться функциями расположенными в динамической библиотеке их нужно объявлять с ключевым словом __declspec(dllexport), например: void __declspec(dllexport) MyFunc(), а вот в проекте, к которому будет подключен dll файл, следует, придерживаться данному правилу объявления импортируемых функций: void __declspec(dllimport) MyFunc(). Для наглядности я опишу процесс создания библиотеки dll и её использования.
В качестве примера запихаем в dll функцию сложения двух чисел. Для начала объявим прототип функции сложения в заголовочном файле header.h:

int __declspec(dllexport) Sum(int a, int b);

И реализуем в файле DllMain.cpp:

#include <windows.h>
#include "header.h"

bool APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
	return true;
}

int __declspec(dllexport) Sum(int a, int b)
{
	return a + b;
}

Читать далее

Реклама

Осторожно! Мошенники! http://apples-msk.ru (сейчас http://apl-msk.ru)

Начнем по порядку.

1. В августе 2014 года, а именно 2.04.2014 года задумался я о приобретении Apple iPhone. Выбрал модель 5S Gold 16Gb. Очень долго искал, в каком бы интернет-магазине произвести покупку.

2. Выбор мой пал на сайт http://apples-msk.ru (сейчас http://apl-msk.ru)

С первого взгляда все оказалось хорошо, выбрал модель, приобрел. Но как оказалось, история покупки только началась… Читать далее

Как узнать родителя процесса

Как узнать родителя процесса:

Imports System.ComponentModel

Imports System.Runtime.InteropServices
    <DllImport("ntdll.dll", EntryPoint:="NtQueryInformationProcess")> _
    Public Function NtQueryInformationProcess(ByVal handle As IntPtr, _
                                              ByVal processinformationclass As UInteger, _
                                              ByRef ProcessInformation As Process_Basic_Information, _
                                              ByVal ProcessInformationLength As Integer, _
                                              ByRef ReturnLength As UInteger) As Integer
    End Function

    Public Structure Process_Basic_Information
        Public ExitStatus As IntPtr
        Public PepBaseAddress As IntPtr
        Public AffinityMask As IntPtr
        Public BasePriority As IntPtr
        Public UniqueProcessID As IntPtr
        Public InheritedFromUniqueProcessId As IntPtr
    End Structure

   'Получение родителя процесса
    Public Function ParentID(ByRef Proc As Process) As IntPtr
        Dim PBI = New Process_Basic_Information()
        Dim writed As Integer

        Try
            If NtQueryInformationProcess(Proc.Handle, 0, PBI, Marshal.SizeOf(PBI), writed) <> 0 Then
                Throw New Win32Exception(Marshal.GetLastWin32Error())
            End If
#If DEBUG Then
            MsgBox("Process Name: " & Proc.ProcessName & vbCrLf & _
                   "Parent ID: " & Convert.ToString(PBI.InheritedFromUniqueProcessId), _
                   MsgBoxStyle.OkOnly)
#End If
            Return PBI.InheritedFromUniqueProcessId
        Catch ex As Exception
#If DEBUG Then
            MsgBox("Error:" & vbCrLf & ex.Message, MsgBoxStyle.OkOnly, ex.Source)
#End If
            Return 0
        End Try
    End Function

    Public Function ParentID(ByVal ProcID As IntPtr) As IntPtr
        Dim PBI = New Process_Basic_Information()
        Dim writed As Integer
        Dim Proc As Process

        Try
            Proc = Process.GetProcessById(ProcID)
            Try
                If NtQueryInformationProcess(Proc.Handle, 0, PBI, Marshal.SizeOf(PBI), writed) <> 0 Then
                    Throw New Win32Exception(Marshal.GetLastWin32Error())
                End If
#If DEBUG Then
                MsgBox("Process Name: " & Proc.ProcessName & vbCrLf & _
                       "Parent ID: " & Convert.ToString(PBI.InheritedFromUniqueProcessId), _
                       MsgBoxStyle.OkOnly)
#End If
                Return PBI.InheritedFromUniqueProcessId
            Catch ex As Exception
#If DEBUG Then
                MsgBox("Error:" & vbCrLf & ex.Message, MsgBoxStyle.OkOnly, ex.Source)
#End If
                Return 0
            End Try
        Catch ex As Exception
#If DEBUG Then
            MsgBox("Error:" & vbCrLf & ex.Message, MsgBoxStyle.OkOnly, ex.Source)
#End If
            Return 0
        End Try
    End Function

Проверим наличие интернет соединения

Проверим наличие интернет соединения на VBA с помощью функции из библиотеки wininet.dll:

Private Declare Function InternetGetConnectedState _  
Lib "wininet.dll" (ByRef lpSFlags As Long, _  
ByVal dwReserved As Long) As Long  
  
Public Function InternetConnected() As Boolean  
  
  'Если у вас есть соединение, то функция вернет True, иначе - False  
  InternetConnected = InternetGetConnectedState(0&, 0&)  
  
End Function

Список надстроек в библиотеке и памяти

Просмотреть список надстроек, хранящихся в папке библиотеки (LIBRARY) и в памяти:

Sub AddIns_List()  
Dim iFor%, iRow%, WS As Worksheet  
  
  iRow = 1  
  Set WS = ThisWorkbook.Worksheets("AddIns")  
  
'Видит только папку LIBRARY  
  If Application.AddIns.Count > 0 Then  
  WS.Cells(iRow, 1) = "Установлены следующие надстройки (AddIns):"  
  For iFor = 1 To Application.AddIns.Count  
  iRow = iRow + 1  
  WS.Cells(iRow, 1) = Application.AddIns.Item(iFor).FullName  
  Next iFor  
  End If  
  
' - Только для офиса 2010 и 2013  
#If VBA7 Then  
  If iRow > 1 Then iRow = iRow + 1  
'Видит только папку LIBRARY и то, что сейчас есть в памяти  
  If Application.AddIns2.Count > 0 Then  
  WS.Cells(iRow, 1) = "Установлены следующие надстройки (AddIns2):"  
  For iFor = 1 To Application.AddIns2.Count  
  iRow = iRow + 1  
  WS.Cells(iRow, 1) = Application.AddIns2.Item(iFor).FullName  
  Next iFor  
  End If  
  
  If iRow > 1 Then iRow = iRow + 1  
'Description, Guid, ProgId - String; Connect - Boolean  
  If Application.COMAddIns.Count > 0 Then  
  WS.Cells(iRow, 1) = "Установлены следующие надстройки (COMAddIns):"  
  For iFor = 1 To Application.COMAddIns.Count  
  iRow = iRow + 1  
  WS.Cells(iRow, 1) = Application.COMAddIns.Item(iFor).Description  
  Next iFor  
  End If  
#End If  
  
If Not WS Is Nothing Then Set WS = Nothing  
End Sub