Solved

Call VB ActiveX dll from C language

Posted on 2004-04-06
6
582 Views
Last Modified: 2012-06-22
The scenario is simple - a screen displays a list of data. Click an item on the list to display an scanned image. A document id is passed to determine which image to display. IBM imaging software displays the image.

Problem is: IBM imaging software uses ActiveX VB dll to display image and screen is written in J. D. Edwards which is a low level C language, so I must call the VB dll from C language. I'm using MS Studio 6. I wonder if this is possible?????

I have the following so far. When I click the screen, it goes through the program and does nothing. I have tried to debug this by adding some dll's into the Program Settings with no success. A window pops up showing the Disassembly, breakpoints are not recognized and I can't display any field values.

Any help is very much appreciated ... Jim

// code from header

#include <windows.h>
typedef (*PFNJDE2CM)( LPCSTR ); // VB dll to call receives one string parm

#ifndef DATASTRUCTURE_D550413M
#define DATASTRUCTURE_D550413M

typedef struct tagDSD550413M
{
  char              szDOCNAME[9];      // string parm is passed into this header
} DSD550413M, *LPDSD550413M;  // and stored in this struct

#define IDERRszDOCNAME_2                          1L

#endif

......
// code from .c
#define B550413M_c
#include <B550413M.h>   // this is header above

{
   int nResult = 0;
   PFNJDE2CM lpJDE2CM;
   HINSTANCE hLibrary;

   hLibrary = LoadLibrary("c:\\JDE2CM.dll.dll"); // this is VB dll

   if(hLibrary != NULL)
   {
        // gets the address of the function inside the VB dll
        lpJDE2CM = (PFNJDE2CM) GetProcAddress (hLibrary, "DllGetClassObject");

            if(!lpJDE2CM)
      FreeLibrary(hLibrary);
            else
           {
               // call the VB dll function
                const char *docid = 0;          
      docid = lpDS->szDOCNAME;    
      nResult = lpJDE2CM(docid);    
           }
}

   return (ER_SUCCESS);
}

0
Comment
Question by:jimjung27
  • 4
6 Comments
 
LVL 9

Accepted Solution

by:
ankuratvb earned 250 total points
ID: 10766292
0
 
LVL 5

Expert Comment

by:Droby10
ID: 10766343
i've never done this, but i would suggest maybe disassembling a vb written exe that makes use of the same dll.  the reason being i bet there is a bootstrap of sorts that centers around the msvbxxx.dll runtime, and _perhaps_ even plays a role in providing a layer of com dispatching.  i'm not certain of either of those things, but they sound logical at the surface level.

0
 
LVL 9

Expert Comment

by:ankuratvb
ID: 10766412
0
Salesforce Made Easy to Use

On-screen guidance at the moment of need enables you & your employees to focus on the core, you can now boost your adoption rates swiftly and simply with one easy tool.

 
LVL 9

Expert Comment

by:ankuratvb
ID: 10766422
Just do a google on 'call vb activex dll c language' in google groups.

U'll get plenty of similar links.
0
 

Author Comment

by:jimjung27
ID: 10777626
I'm still alive but dying to get rid of the 250 points...

I've written 2 cpp wrappers using some of the info from the links - thanks for the tip.

One of them disassembles the VB code and one imports the VB code. One is an exe and one is a dll.

They both only compile if an unsigned short** datatype is passed to the VB function, but the function actually receives a string (coded in the VB function). Why is this?

The only other problem I have is I get a link error:

LNK4098: defaultlib "msvcrt.lib" conflicts with use of other libs; use /NODEFAULTLIB:library

When I try to go into the MS Studio Project Settings, the Link tab is missing??? I think this may be because of the J.D.Edwards not accepting any of the cpp code or settings. Id their a manual way to run the link from DOS?
0
 
LVL 9

Expert Comment

by:ankuratvb
ID: 10780185
See this:

http://www-unix.mcs.anl.gov/mpi/mpich/docs/mpichntman/node10.htm

It shows how to compile in VC++ from the command line.
It should solve ur problem.

U can explicitly call the link.exe and give the /NODEFAULTLIB option there.
0

Featured Post

Flexible connectivity for any environment

The KE6900 series can extend and deploy computers with high definition displays across multiple stations in a variety of applications that suit any environment. Expand computer use to stations across multiple rooms with dynamic access.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
C simple state machine for client server handshake 4 339
How to creat good software interface ? 1 69
Constant string is of type char *   ? 7 42
Fill Null values 5 28
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
The goal of this video is to provide viewers with basic examples to understand and use structures in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.

831 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question