It's doable, but not that nice.
C++ Dll Header
Code:
#include "stdafx.h"
#include <oleauto.h>
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT void ReadOutArrayOfStrings(LPSAFEARRAY* StringArray);
C++ Main File
Code:
#include "stdafx.h"
#include "MyC++Dll.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
DLLEXPORT void ReadOutArrayOfStrings(LPSAFEARRAY* StringArray)
{
char** StrPtr = 0;
long LowerBound = 0;
long UpperBound = 0;
SafeArrayGetLBound(*StringArray,1,&LowerBound);
SafeArrayGetUBound(*StringArray,1,&UpperBound);
SafeArrayAccessData(*StringArray, reinterpret_cast<void**>(&StrPtr));
for(int i = LowerBound; i <= UpperBound;++i)
MessageBox(HWND_DESKTOP,StrPtr[i],"From VB",MB_OK);
SafeArrayUnaccessData(*StringArray);
}
VB Form Code
Code:
Private Declare Sub ReadOutArrayOfStrings _
Lib "MyC++Dll.dll" (theArray() As String)
Private Sub Command1_Click()
Dim StringArray(9) As String
StringArray(0) = "All"
StringArray(1) = "Work"
StringArray(2) = "And"
StringArray(3) = "No"
StringArray(4) = "Play"
StringArray(5) = "Makes"
StringArray(6) = "Jack"
StringArray(7) = "A"
StringArray(8) = "Dull"
StringArray(9) = "Boy"
ReadOutArrayOfStrings StringArray
End Sub