Avatar billede the_julle Praktikant
01. februar 2012 - 08:51 Der er 10 kommentarer og
1 løsning

Åben C# program og send string til programmet.

Hej alle.

Jeg har en Excel-macro som åbner en .exe-fil, jeg har lavet i C#. Jeg åbner den således:

Dim ret As Variant
ret = Shell("d:\my documents\test.exe", vbNormalFocus)

Kan jeg sende nogle indformation med over, som jeg kan bruge i C#-programmet? F.eks en string?

På forhånd tak.
Avatar billede tjp Mester
01. februar 2012 - 10:50 #1
Du ku la programmet modtage kommandolinje argumenter. Se fx: http://msdn.microsoft.com/en-us/library/aa288457(v=vs.71).aspx
Avatar billede the_julle Praktikant
01. februar 2012 - 11:33 #2
Det er en windows form applikation. Eksemplet er til consol-applikationer. Kan man gøre noget tilsvarende med en windows form applikation?
Avatar billede the_julle Praktikant
06. februar 2012 - 12:23 #4
@ tjp: OK, så dette er koden til at gøre det
string[] args = Environment.GetCommandLineArgs();

foreach(string arg in args){
// do stuff
}

Men hvordan parse man så nogle argumenter. Som nævnt kalder jeg min .exe-fil fra en Excel-macro. Hvor skal jeg specificere argumenterne?

Desuden, kan man kun parse strings? Hvad hvis jeg gerne vil parse en string og en boolean?
Avatar billede tjp Mester
06. februar 2012 - 13:43 #5
Eksempel på macro der kalder 'AcroRd32.exe' med argumentet 'C:\Program Files\Adobe\Reader 9.0\Reader\plug_ins\Annotations\Stamps\Words.pdf'. Bemærk mellemrum mellem de to:

Private Sub TestAcrobatReader()

    Const strcProgramName As String = _
        "C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"
    Const strcFilePath As String = _
        "C:\Program Files\Adobe\Reader 9.0\Reader\plug_ins\" _
        & "Annotations\Stamps\Words.pdf"

    Dim dblProgTaskID As Double
    Dim strPathName As String

    strPathName = strcProgramName & " " & strcFilePath
    dblProgTaskID = Shell(strPathName, vbMaximizedFocus)
    MsgBox "Program Task ID:  " & dblProgTaskID
   
End Sub

Du kan bare overføre booleans som strings, fx "True" eller "false", og konvertere dem i programmet med Convert.ToBoolean eller Boolean.Parse.
Avatar billede the_julle Praktikant
06. februar 2012 - 14:05 #6
Det fungere bare super! Tusind tak!

Lige pt. har jeg også defineret en command line argument inde i C#-projektet's properties. Denne bliver overskrevet når jeg kalder C#-programmet fra VBA-koden, hvilket er det jeg ønsker.

Hvis jeg kører programmet fra min C#-editor (MS Visual C#2010 express), er det dette argument, og selvfølgelig ikke det fra VBA der anvendes, hvilket også er det jeg ønsker.

Men hvis jeg finder exe-filen udenom min editor og udenom VBA, altså via mapper (..\bin\Debug\program.exe), så får jeg bare en fejl: "Program har fundet en fejl og afsluttes". Hvorfor tager den ikke det command line argument jeg har specificeret?

Det er lidt svært at forklare, men håber det giver mening. Det jeg bare forsøger at gøre er, at definere en default command line argument, som så erstattes hvis man specificere andet.
Avatar billede tjp Mester
06. februar 2012 - 14:32 #7
Er det ikke bare at tjekke om det returnerede array fra GetCommandLineArgs() er længere end 0 og hvis ikke, bruge defaultværdierne?
Avatar billede the_julle Praktikant
06. februar 2012 - 14:44 #8
Nå jo. Hvorfor gøre det sværre end det er :o)

Lige et sidste tillægsspørgsmål: Jeg ville gerne anvende en string, som angiver stien på den aktuelle workbook (inkl navnet på filen).

    Dim filePath As String
    filePath = ThisWorkbook.Path

Men overstående returnere ikke navnet på filen, og desuden er stien ikke korrekt når man man parser den til C#, hvis stien indeholder et mellemrum. Har du et løsningsforslag?
Avatar billede the_julle Praktikant
06. februar 2012 - 14:57 #9
Følgende kode får hele stien, som jeg ønsker.

    Dim filePath As String
    filePath = ActiveWorkbook.FullName

Men det er som om, at jeg mangler et " i hver ende af stringen (da stringen indeholder mellemrum).
Avatar billede the_julle Praktikant
06. februar 2012 - 15:14 #10
Og det blev løst på følgende måde:

    filePath = Chr(34) + ActiveWorkbook.FullName + Chr(34)


Tak for hjælpen.
Avatar billede tjp Mester
06. februar 2012 - 20:58 #11
Velbekomme... Det var også omtrent sådan jeg ville løse det sidste. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester