Letztendlich habe ich die Lösung dann doch selbst noch erarbeitet (nicht aus dem Internet)
Code:
[Serializable, StructLayout(LayoutKind.Sequential)]
public struct HTAGS
{
private IntPtr _htags;
public IntPtr HTags
{
get { return _htags; }
set { _htags = value; }
}
}
Jetzt geht das!
Code:
//TagsLibrary_Create
[DllImport("TagsLib.dll", EntryPoint = "TagsLibrary_Create", CharSet = CharSet.Auto)]
public static extern HTAGS TagsLibrary_Create();
und das! (Darum ging es mir.. Die
API gleich zu halten mit den Aufruf Konventionen.
Code:
//TagsLibrary_Free
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("TagsLib.dll", EntryPoint = "TagsLibrary_Free", CharSet = CharSet.Auto)]
public static extern bool TagsLibrary_Free(HTAGS Tags);
in der Anwendung wird dann einmalig HTAGS definiert.
Code:
hTags = TagsLib.TagsLibrary_Create()
If TagsLib.TagsLibrary_Free(hTags) Then
MessageBox.Show("Is Free")
End If
In Delphi ist der Aufruf wie folgt!
t_TagsLibrary_Free = function (Tags: HTags): LongBool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
Und genau diese Art des Aufrufs wollte ich beibehalten
Tags: HTags
Deshalb schreibe ich die Lib (Wrapper in C#) damit Developer mit VB_NET sich mit der
API nicht rumquälen müssen.
gruss