Avatar billede koppelgaard Praktikant
01. november 2009 - 21:48 Der er 11 kommentarer og
1 løsning

exe med returværdi

Fra Excel kan man køre en exe-fil:
Sub Runcalc()
Dim RetVal
RetVal = Shell("C:\WINDOWS\CALC.EXE", 1)
End Sub

Hvis exe-filen er lavet i C#, hvorledes kan man så få den til at returner en værdi til Excel?
Jeg har brug for at læse comporten og har lavet et lille program, der kan det. Men hvordan returnerer jeg den aflæste værdi til Excel?
Avatar billede arne_v Ekspert
01. november 2009 - 21:51 #1
Environment.Exit(77);

returnerer 77.
Avatar billede koppelgaard Praktikant
01. november 2009 - 21:59 #2
Sådan ?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Environment.Exit(77);

        }
    }
}

og herefter;

Sub Runcalc()
Dim RetVal
RetVal = Shell("c:\Documents and Settings\mko\My Documents\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe", 1)
End Sub


Kan ikke få 77 lagt i RetVal. 4732 kommer retur i stedet....
Avatar billede arne_v Ekspert
01. november 2009 - 22:11 #3
C# koden er god nok.

Men VBA koden skal modificeres lidt (meget).

http://www.visualbasic.happycodings.com/Applications-VBA/code20.html
Avatar billede koppelgaard Praktikant
01. november 2009 - 22:20 #4
Du minde kineser - det har du ret i!
Det er mit hoved for træt til dag...
Jeg ser på det i morgen - forløbig tak..
Avatar billede bvli Praktikant
02. november 2009 - 12:23 #5
Men i øvrigt kan en Main-metode også returnere en værdi.

class Test {
  static int Main(string[] args) {
    return 77;
  }
}
Avatar billede koppelgaard Praktikant
02. november 2009 - 18:53 #6
Det var jo ikke så svært - og det virkede.
Sender du et svar?

Michael
Avatar billede arne_v Ekspert
02. november 2009 - 19:43 #7
svar
Avatar billede koppelgaard Praktikant
02. november 2009 - 20:52 #8
Måtte dog modificerer lidt

Option Explicit

Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long

'This
Sub Main()
    Dim lTaskID As Long, lPID As Long, lExitCode As Long, sAppDir As String
    Const INFINITE = &HFFFFFFFF      '  Infinite timeout
    Const SYNCHRONIZE = &H100000
    Const STILL_ACTIVE = 0
    Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Const PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)
   
    sAppDir = Application.path
    If Right$(sAppDir, 1) <> "\" Then
        sAppDir = sAppDir & "\"
    End If
'    MsgBox "This application will now start another application (out of process)." & vbNewLine & _
'    "Please enter a return value and click Close" & vbNewLine & _
'    "This display the value entered in the other application...", vbInformation
    'Shell Application
    lTaskID = Shell("c:\Documents and Settings\mko\My Documents\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe", 1)
    'Get process handle
    lPID = OpenProcess(PROCESS_ALL_ACCESS, True, lTaskID)
    If lPID Then
        'Wait for process to finish
        'Note, you must now enter a value in the form and click close.
        Call WaitForSingleObject(lPID, INFINITE)
        'Get Exit Process
        If GetExitCodeProcess(lPID, lExitCode) Then
            'Received value
          ActiveCell.Value = lExitCode
        Else
            MsgBox "Failed: " & DLLErrorText(Err.LastDllError), vbCritical
        End If
    Else
        MsgBox "Failed: " & DLLErrorText(Err.LastDllError), vbCritical
    End If
    lTaskID = CloseHandle(lPID)
End Sub

'Purpose    :  Return the error message associated with LastDLLError
'Inputs      :  lLastDLLError              The error number of the last DLL error (from Err.LastDllError)
'Outputs    :  Returns the error message associated with the DLL error number


Public Function DLLErrorText(ByVal lLastDLLError As Long) As String
    Dim sBuff As String * 256
    Dim lCount As Long
    Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100, FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000
    Const FORMAT_MESSAGE_FROM_HMODULE = &H800, FORMAT_MESSAGE_FROM_STRING = &H400
    Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000, FORMAT_MESSAGE_IGNORE_INSERTS = &H200
    Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF
   
    lCount = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0, lLastDLLError, 0&, sBuff, Len(sBuff), ByVal 0)
    If lCount Then
        DLLErrorText = Left$(sBuff, lCount - 2)    'Remove line feeds
    End If
   
End Function
Avatar billede koppelgaard Praktikant
02. november 2009 - 21:00 #9
der var jeg lidt for hurtig

Environment.Exit() tager kun int og jeg skal sende en double
Avatar billede koppelgaard Praktikant
02. november 2009 - 21:04 #10
kan selvfølgelig gange med 1000 og caste til int, og så dividerer med 1000 i Excel.....
Avatar billede arne_v Ekspert
02. november 2009 - 21:12 #11
Programmer returnerer altid heltal som status.

Nogle styre systemer tillade kun 0 - 255. Men jeg mener at Windows tillader 0 - 4 milliarder.

Saa *1000 og /1000 er en fin loesning.
Avatar billede koppelgaard Praktikant
02. november 2009 - 21:16 #12
Jamen det virker også fint:-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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