# ActiveX-DLL in Pascal (Delphi/Lazarus)



## Maagic7 (23 April 2018)

Ich möchte eine ActiveX-Dll erstellen, so dass man in WinCC-Flexible per VBScript darauf zugreifen kann. 
Eine normale DLL mit Lazarus ist kein Problem (leider kann man die in VBS aber nicht einbinden, deshalb die ActiveX, welche eine Klasse zur Verfügen stellen soll, die dann
entsprechende Funktionen ausführt.

Hier mal mein Code um ein Bit aus einem DWORD zu lesen bzw. ein Bit zu setzen. Ohne den Export-Abschnitt wird es schon mal fehlrfrei kompliert.
Der Export einer Klasse funktioniert natürlich so nicht. Leider hab ich keine Ahnung wie und ob man das mit Pascal hinbekommt. Ich hab schon mehrere Stunden
gegoogelt aber man findet weder wie man ActiveX-DLL in Delphi erstellt noch in Lazarus. 
D.h. für mich: entwerder es ist total simpel oder es geht nicht!

*WER weis was dazu?*


```
library VbsExt;
// Provides methods to manipulate Bits in VB-Script
{$mode objfpc}{$H+}

uses
  Classes, Windows;

TYPE
 VbsBitLogic = class
  public
    constructor Create;
    Function GetBit (Value:DWORD; NoOfBit:Smallint): WordBool;  stdcall;
    Function SetBit(Value:DWORD; NoOfBit:Smallint; BitValue: WordBool):DWORD; stdcall;
  end;


constructor VbsBitLogic.Create;
begin
    inherited Create;
end;

function VbsBitLogic.GetBit(Value:DWORD; NoOfBit:Smallint): WordBool; stdcall;
Begin
// WordBool erzeugt in Pascal 0=FALSE; &FFFF=TRUE, was in VB (-1) ist
// ist nötig, da VB 16Bit Bool verwendet
 GetBit := ((1 SHL NoOfBit) AND VALUE) <> 0;
end;

Function VbsBitLogic.SetBit(Value:DWORD; NoOfBit:Smallint; BitValue:WordBool):DWORD; stdcall;
 // var in PACAL is same as ByRef in VB, so VB has to pass it's Variable ByRef
BEGIN
IF BitValue THEN BEGIN
     SetBit :=  (1 SHL NoOfBit) OR Value;
  END
  ELSE BEGIN
     SetBit := (NOT (1 SHL NoOfBit)) AND Value;
  END;

end;

exports
 VbsBitLogic;
end.
```


----------



## Maagic7 (9 Juni 2018)

Hab's jetzt nach langem suchen und probieren rausgefunden!

ActiveX in Lazarus geht nicht ohne weiteres!
Es ist viel Handarbeit erforderlich.

Das größte Problem: man muss die Typlibrary von Hand erstellen und dann mit MIDL.EXE (Microsoft Interface definiton language - Compliler [ist im Windows SDK enthalten]) complilieren.

Systeme wie VisualStudio und Delphi nehmen einem die Arbeit praktisch weitgehend ab.

Ein weiteres Problem ist wohl eine VB-spezifische Eigenheit in der Auführung von TypLib's  (VB verlangt ageblich '_' vor den exportieren Methoden/Funktionen.)

Es gibt auf Github ein Demoprojekt, welches zeigt wie man unter Lazuarus einen ActiveX Export hinbekommt
https://github.com/MartinTrummer/lazarus-com-example

Das Problem um das es eigentlich geht ist, wie bringe ich eigene DLL-Funktionen nach VB-Script.
Da VB-Script DLLs nicht direkt unterstützt bleibt nur der Umweg, die DLL Funktionen in ein Objekt 
in einer ActivX-Dll zu packen.

Bisher hatte ich das immer folgednermaßen gelöst.
Mit C++, PureBasic, Lazuarus oder Assembler eine DLL erstellt,
in VB6 dann ein ActiveX-Dll Projekt und dort die benötigten DLL funktionen
als Methoden in eine Klasse gelegt und diese dann exportiert.

Da ich VB6 nicht mehr verwenden möchte und die NET Abhängigkeit (was grundsätzlich kein Problem ist)
umgehen wollte, hatte ich versucht das direkt in Lazarus zu machen.


----------

