Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
CODE PROJECT For Those Who Code
  • Home
  • Articles
  • FAQ
Community
  1. Home
  2. General Programming
  3. C#
  4. HowTo make a dll, which can be called by VBA

HowTo make a dll, which can be called by VBA

Scheduled Pinned Locked Moved C#
csharpquestion
17 Posts 5 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Ariadne

    Thanks. If I use tlbexp I get only my class exposed, but not my methods. Any ideas? (I suppose, the methods have to have a certain format.) Nevertheless I do not belive, that a COM-object is the only way to get a connection to VBA. With a COM-object you do not need a Declare Function statement. But with a Declare Function one can access all routines eg. in the kernel.dll. (And that are not COM's in kernel.dll).

    Ariadne

    A Offline
    A Offline
    Ariadne
    wrote on last edited by
    #8

    public class PW { public static string Convert5Bit(byte[] abytID) { //do somthing here ... return sConv; } } This is the declaration. But only PW as class is exposed. -- modified at 5:19 Thursday 26th October, 2006

    Ariadne

    N S 2 Replies Last reply
    0
    • A Ariadne

      public class PW { public static string Convert5Bit(byte[] abytID) { //do somthing here ... return sConv; } } This is the declaration. But only PW as class is exposed. -- modified at 5:19 Thursday 26th October, 2006

      Ariadne

      N Offline
      N Offline
      Nader Elshehabi
      wrote on last edited by
      #9

      First: Post your question to my answers, not to your question. I only saw your question by chance. Second: Try to reference to your new COM object in a C++ or C# project and see what is/isn't exposed Third: If none other works -I'm not that expert in VBA so if applicable- Make your method non-static, and call it form an instance of the class rather than the calss itself. Ps. BTW, what way did you know by it's not exposed?

      Regards:rose:

      A 1 Reply Last reply
      0
      • A Ariadne

        public class PW { public static string Convert5Bit(byte[] abytID) { //do somthing here ... return sConv; } } This is the declaration. But only PW as class is exposed. -- modified at 5:19 Thursday 26th October, 2006

        Ariadne

        S Offline
        S Offline
        SSLaks
        wrote on last edited by
        #10

        VBA does not support static functions. Also, you are confusing Declare with COM. To get at an exposed COM object in VBA, ad a reference to it, then instansiate the class. Declare Function has nothing to do with COM - it uses access points, which cannot be created from C#. To create an access point, use an MFC dll. Schabse S. Laks

        1 Reply Last reply
        0
        • N Nader Elshehabi

          First: Post your question to my answers, not to your question. I only saw your question by chance. Second: Try to reference to your new COM object in a C++ or C# project and see what is/isn't exposed Third: If none other works -I'm not that expert in VBA so if applicable- Make your method non-static, and call it form an instance of the class rather than the calss itself. Ps. BTW, what way did you know by it's not exposed?

          Regards:rose:

          A Offline
          A Offline
          Ariadne
          wrote on last edited by
          #11

          thanks for 1st. 2nd I look into the code with notepad and try in VBA the Object-Browser. both show only PW and not Convert5Bit() 3rd it tried that, but no success. thanks for your ansers! :rose:

          Ariadne

          N 1 Reply Last reply
          0
          • A Ariadne

            Really? Is it complicate to register a dll as com?

            Ariadne

            E Offline
            E Offline
            ednrgc
            wrote on last edited by
            #12

            you should check : ServicedComponent

            1 Reply Last reply
            0
            • A Ariadne

              thanks for 1st. 2nd I look into the code with notepad and try in VBA the Object-Browser. both show only PW and not Convert5Bit() 3rd it tried that, but no success. thanks for your ansers! :rose:

              Ariadne

              N Offline
              N Offline
              Nader Elshehabi
              wrote on last edited by
              #13

              Ariadne wrote:

              Object-Browser. both show only PW and not Convert5Bit()

              Well, in that object browser the method should be under the class name, shouldn't it? I mean you access the method by the class name? Also what file did you look into using the notepad?

              Ariadne wrote:

              3rd it tried that, but no success.

              Define "no success"? You can't instantiate the object from the exposed class? Or the instance can't access the member function?

              Regards:rose:

              A 1 Reply Last reply
              0
              • N Nader Elshehabi

                Ariadne wrote:

                Object-Browser. both show only PW and not Convert5Bit()

                Well, in that object browser the method should be under the class name, shouldn't it? I mean you access the method by the class name? Also what file did you look into using the notepad?

                Ariadne wrote:

                3rd it tried that, but no success.

                Define "no success"? You can't instantiate the object from the exposed class? Or the instance can't access the member function?

                Regards:rose:

                A Offline
                A Offline
                Ariadne
                wrote on last edited by
                #14

                Nader Elshehabi wrote:

                Also what file did you look into using the notepad?

                I opened the tlb-File with notepad: There was no Convert5Bit.

                Nader Elshehabi wrote:

                object browser the method should be under the class name

                Under the class name is no method. If I instantiate the class I get an runtime error: 429 ActiveX component can't create object. But VBA knows the class PW.

                Ariadne

                N A 2 Replies Last reply
                0
                • A Ariadne

                  Nader Elshehabi wrote:

                  Also what file did you look into using the notepad?

                  I opened the tlb-File with notepad: There was no Convert5Bit.

                  Nader Elshehabi wrote:

                  object browser the method should be under the class name

                  Under the class name is no method. If I instantiate the class I get an runtime error: 429 ActiveX component can't create object. But VBA knows the class PW.

                  Ariadne

                  N Offline
                  N Offline
                  Nader Elshehabi
                  wrote on last edited by
                  #15

                  Well, I haven't tested the issue thoroughly. I did some googling and found this post on MSDN forum Post link[^] and here are two more articles in MSDN about the issue: Article 1[^] Article 2[^] Also I did what I told you. I made a tlb from the .Net dll, and it actually references to the class and the methods inside the class!! About the instantiation errer; Did you make your constructor public? I hope this directs you somewhere. Good luck! And I'm waiting for your feedback.

                  Regards:rose:

                  A 1 Reply Last reply
                  0
                  • N Nader Elshehabi

                    Well, I haven't tested the issue thoroughly. I did some googling and found this post on MSDN forum Post link[^] and here are two more articles in MSDN about the issue: Article 1[^] Article 2[^] Also I did what I told you. I made a tlb from the .Net dll, and it actually references to the class and the methods inside the class!! About the instantiation errer; Did you make your constructor public? I hope this directs you somewhere. Good luck! And I'm waiting for your feedback.

                    Regards:rose:

                    A Offline
                    A Offline
                    Ariadne
                    wrote on last edited by
                    #16

                    Thanks for your articles. I read a lot of stuff too.:omg: But it seams there is something basic wrong. here the story, what I try: 1. I build a classlibrary-project in VS8 C#. 2. I insert one TestDLL class: using System; using System.Collections.Generic; using System.Text; public class TestDLL { public string StringChange(string str) { return str +" from C#"; } } 3. I build the project with a TestDLL.dll as result 4. I run tlbexp TestDLL.dll /win 32 /out:TestDLL.tlb 5. An inspection of TestDLL.tlb with notepad.exe shows no StringChange string. 6. I run regasm TestDLL.dll It returns a waring: RA00000 : there are no types registered (retranslation from german) 7. I tested the same on a virgin VS8 Enviroment on my home notebook with the same result. 8. I have no idea....:(

                    Ariadne

                    1 Reply Last reply
                    0
                    • A Ariadne

                      Nader Elshehabi wrote:

                      Also what file did you look into using the notepad?

                      I opened the tlb-File with notepad: There was no Convert5Bit.

                      Nader Elshehabi wrote:

                      object browser the method should be under the class name

                      Under the class name is no method. If I instantiate the class I get an runtime error: 429 ActiveX component can't create object. But VBA knows the class PW.

                      Ariadne

                      A Offline
                      A Offline
                      Ariadne
                      wrote on last edited by
                      #17

                      That's it: in assemblyinfo.cs there is a switch: [assembly: ComVisible(true)] but it was false Now all works fine...:laugh: Thank you for your support Nader

                      Ariadne

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups