Newsgroup: it.comp.programmare.win32
Titolo: Dll da C a Visual Basic

Salve a tutti,
sono un novizio di C++ e vorrei porre la seguente domanda.
Ho realizzato una funzione in C++ che da una sequenza di immagini mi
crea un filmato.
Ora vorrei che questa diventasse una Dll da poter utilizzare in Visual
Basic.
Qualcunoi mi sa dire da dove copminciare?
Ho realizzato una cosa del genere
extern "C" __declspec (dllexport) void __stdcall MovieToImage(char*
pInizio, char* pFile, int pFps )
ma quando compilo la dll e la richiamo in VB mi segnala "error in
loading dll"
credo che sia dovuto al fatto che devo implementare una funzione MAIN
on un costruttore/distruttore.
Qualcuno puат aiutarni?
Cordiali saluti
Davide Vitiello

 Qualcunoi mi sa dire da dove copminciare?
Ti posto un mio esempio :
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////
#define RegSvr32_Ok   0
#define RegSvr32_Fail_ARGS 1
#define RegSvr32_Fail_OLE 2
#define RegSvr32_Fail_LOAD 3
#define RegSvr32_Fail_ENTRY 4
#define RegSvr32_Fail_REG 5
extern "C" LONG PASCAL EXPORT RegisterService(LPCTSTR FileName, BOOL Unreg)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState());
 CString DllName = FileName;
 long bReturn = RegSvr32_Ok;
 HRESULT (FAR STDAPICALLTYPE * lpDllEntryPoint)(void);
 //BOOL bVisualC = FALSE;
 //BOOL bUnregister = FALSE;
 //LPSTR pszDllEntryPoint = _szDllRegSvr;
 //LPSTR pszDllName = NULL;
 //LPSTR pszTok;
 CString DllEntryPoint;
 if (!Unreg) DllEntryPoint = "DllRegisterServer";
     else DllEntryPoint = "DllUnregisterServer";
 if (DllName=="") return RegSvr32_Fail_ARGS; // RegSvr32_Fail_ARGS
 // Initialize OLE.
 if (FAILED(OleInitialize(NULL)))
 {
//  DisplayMessage(IDS_OLEINITFAILED);
  return RegSvr32_Fail_OLE; // RegSvr32_Fail_OLE
 }
 // Load the library.
 HINSTANCE hLib = LoadLibrary(DllName);
 if (hLib < (HINSTANCE)HINSTANCE_ERROR)
 {
  LPVOID lpMsgBuf;
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)
&lpMsgBuf,0,NULL);
  CString MsgError;
  MsgError.Format("0x%08lx - %s", GetLastError(),lpMsgBuf);
  // Free the buffer.
  LocalFree( lpMsgBuf );
//  DisplayMessage(IDS_LOADLIBFAILED, DllName, MsgError);
  bReturn = RegSvr32_Fail_LOAD; // RegSvr32_Fail_LOAD;
  goto CleanupOle;
 }
 // Find the entry point.
 (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, DllEntryPoint);
 if (lpDllEntryPoint == NULL)
 {
  TCHAR szExt[_MAX_EXT];
  _tsplitpath(DllName, NULL, NULL, NULL, szExt);
/*  if ((stricmp(szExt, ".dll") != 0) && (stricmp(szExt, ".ocx") != 0))
   DisplayMessage(IDS_NOTDLLOROCX, DllName, DllEntryPoint);
  else
   DisplayMessage(IDS_NOENTRYPOINT, DllName, DllEntryPoint);
*/
  bReturn = RegSvr32_Fail_ENTRY; // RegSvr32_Fail_ENTRY
  goto CleanupLibrary;
 }
 // Call the entry point.
 if (FAILED((*lpDllEntryPoint)()))
 {
//  DisplayMessage(IDS_CALLFAILED, DllEntryPoint, DllName);
  bReturn = RegSvr32_Fail_REG; // RegSvr32_Fail_REG;
  goto CleanupLibrary;
 }
 //Info(IDS_CALLSUCCEEDED, pszDllEntryPoint, pszDllName);
// DisplayMessage(IDS_CALLSUCCEEDED, DllEntryPoint, DllName, FALSE,TRUE);
 CleanupLibrary:
  FreeLibrary(hLib);
 CleanupOle:
  OleUninitialize();
 return bReturn;
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////
ricorda di dichiararla nel .def :
; RegSvr32.def : Declares the module parameters for the DLL.
LIBRARY      "RegSvr32"
DESCRIPTION  'RegSvr32 Windows Dynamic Link Library'
EXPORTS
     RegisterService

...


 richiamo in visual basic?
Io Visual Basic non lo conosco, ti so soltanto dire che l'esempio che ti ho
postato era un favore per un collega che utilizza VB e lui non ha avuto
problemi nell'usarlo...
In ogni caso l'utilizzo non dovrebbe differire da una generica chiamata ad
un API...
se non sbaglio ti dichiari il prototipo della funzione specificando in che
dll si trova, una cosa di questo genere
Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA"
(ByVal hwnd As Long, ByVal lpString As String) As Long
Purtroppo dal lato VB non so aiutarti molto...
ciao