Toon posts:

[C#] DLL gebruiken in Cicode (Citect/scada)

Pagina: 1
Acties:
  • 484 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Beste tweakers,

Ik heb hier in C# (code normaal in VB6/VB.NET, ben niet gevorderd in C#) een soort dll geschreven (ook een eerste keer voor mij) met functies om pakketjes via een soort winsock systeem op te vangen en te verwerken.

Die DLL heb ik gecompileerd en roep ik aan in een ander C# project in een form. Daar werkt het goed. Doe ik bijvoorbeeld als volgt:

Bijvoorbeeld in de dll:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
namespace modTest
{
    public class commTest
    {
        public commTest() { }
        public string Test123()
        { 
            return "aap";
        }
    
    }
}


En dan aanroepen in een willekeurig C# programma:
C#:
1
2
3
4
5
6
7
using modTest;

[...]
modTest.commTest m = new commTest();
string strTest = m.Test123();
MessageBox.Show(strTest);
[...]


Nu heb ik de DLL eigenlijk gemaakt om te gebruiken in een SCADA/HMI programma, genaamd Citect. Scripting in dat programma gebeurt met een taaltje dat ze Cicode gedoopt hebben. En in dit taaltje heb ik de mogelijkheid om DLLs te laden en te gebruiken.

Volgens de beschrijving gaat dit als volgt (zo even uit de help files geript):
DLLOpen
DLLCall

Dus heb ik per test even weer dit in elkaar geflansed (na mijn DLL naar een map in PATH verbannen te hebben):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INT hTest;

FUNCTION InitMyDLLs()
    Message ("Venster titel", "Start laden dll", 0);
    hTest = DLLOpen("modTest.dll", "Test123", "C");
END

STRING
FUNCTION
Aap()
    Message ("Venster titel", "Start aanroepen dll", 0);
    STRING sResult;
    sResult = DLLCall(hTest, "");
    Message ("Venster titel", sResult, 0);
    RETURN sResult;
END


Hoewel ik niets doe met die laatste return daar; moet dat niets uitmaken. Dat laatste argument van de message functie is het type messagebox dat je krijgt (0 = notify oid) en de rest spreekt wel voor zich denk ik.

Als ik die code aanroep (uiteraart eerst InitMyDLLs() gevolgd door Aap()) krijg ik op de juiste volgorde mijn messageboxes op mijn scherm. Helaas is die laatste leeg (inhoud van de msgbox)! er komt dus geen aap uit mijn functie, hoe ik speel met dat hFunction argument van DLLCall, het lukt me niet.

Nou beste modjes, mijn best gedaan dit keer een duidelijkere vraagstelling te maken dan mijn gebruikelijke raadsels; Moet ik mijn dll op een andere manier aanroepen? Of zelfs op een andere manier opbouwen?

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 08:28
Die Cicode, kan die ook overweg met .Net? Of moeten de dll's die voor Cicode aangeleverd worden als COM component geinstalleerd zijn? Als het dit laatste is, moet je het volgende eens doornemen: http://www.codeproject.co...xp=0&fr=26&select=1145321

Je kan .Net code laten registreren als COM components, maar er zijn wel wat dingen waarmee je rekening mee moet houden. Zoals daar zijn: Een GuidAttribute bovenaan je klasse zetten, je assembly strong namen, met regasm de dll registreren in het register en je assembly in de GAC zetten (vandaar ook het strong namen)

Verwijderd

Topicstarter
Thanks, grote kans dat het voor deze versie niet werkt in de huidige vorm.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Die link heeft het over native dll's, geen .Net geen COM

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Nou als we toch met programeer talen aan het strooien zijn (sommige client apps in dit project zijn vb6, sommige vb.net en de dll's C# (die moetk dus mischien omschrijven naar VC++ als dit niet gaat werken, beetje mijn vocabulair uitbreiden dus :D), heb net een test dll gemaakt in VC++:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

int main() {
    return 0;
}

int test() {
    return 3;
}


Als ik die aanroep met:
code:
1
2
3
4
5
[...]
DLLOpen("testDLL.dll", "test", "H");
[...]
DLLCall(hTest, "");
[...]


Komt er weer niets uit! En het probleem is dat ik een oude, niet meer ondersteunde versie, moet gebruiken en dus geen support heb op dat cicode. De debugger is ook waardeloos, en ik wil bij deze dus iedereen die ooit de Industriële Automatisering ingaat afraden om voor projecten met eigen software applicaties dit @#$$% pakket te gebruiken!

Verwijderd

Topicstarter
EXPORTS vergeten 8)7 !

Hoewel ik het liever in C# gedaan had :(.

Kan trouwens deze DLL dan weer niet toevoegen aan mijn recourses in een C#/VB.NET project? Maar dat is weer een ander topic gok ik.

[ Voor 52% gewijzigd door Verwijderd op 28-03-2007 15:58 ]

Pagina: 1