I have a C++ DLL function with the following definition-
char * scanImage(char * fileDir)
Code:
{
string dir(fileDir);
string cvStr = cvScan(dir);
char * scanReturn;
scanReturn = (char*)CoTaskMemAlloc((cvStr.size() + 1) * sizeof(char));
strcpy(scanReturn, cvStr.c_str());
cout << "DLL Output: " << endl << scanReturn <<endl;
return scanReturn;
}
Headerfile of the DLL is-
Code:
#pragma once
#include <Windows.h>
#include <string>
using namespace std;
#ifdef THEIA_OPENCV_DLL_EXPORTS
#define THEIA_OPENCV_DLL_API __declspec(dllexport)
#else
#define THEIA_OPENCV_DLL_API __declspec(dllimport)
#endif
extern "C" THEIA_OPENCV_DLL_API char * scanImage(char * fileDir);
Now I want to call this scanImage function from a VB.NET Application.
So far I have been trying these-
Trial 1:
Code:
Imports System.Runtime.InteropServices
Public Class Form1
Public Declare Function scanImage Lib "Theia_OpenCV_Dll.dll"
(<MarshalAs(UnmanagedType.LPStr)> fileDir As String) As IntPtr
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim out As IntPtr = scanImage("files/stu2/2.bmp")
Label1.Text = Marshal.PtrToStringAnsi(out)
End Sub
End Class
This code changed the default text of label1 to blank. But displays nothing. On second click this terminates the program.
Trial 2:
Code:
Imports System.Runtime.InteropServices
Public Class Form1
Public Declare Function scanImage Lib "Theia_OpenCV_Dll.dll" (<MarshalAs(UnmanagedType.LPStr)> fileDir As String) As <MarshalAs(UnmanagedType.LPStr)> System.Text.StringBuilder
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim sb As System.Text.StringBuilder = scanImage("files/stu2/2.bmp")
label1.text = sb.ToString
End Sub
End Class
This gives me-
Program_name has stopped working
and the program terminates immediately.
I am using VB.NET in Visual Studio 2017.
Now how to solve this problem?