時間の都合上C++/Cliは必ず使わなければならない状況です。
今回ソフト上でcppファイルをつくりバッチファイルを用いてコマンドプロンプトからコンパイルしてDLLを作成して
それを動的にロードして使うソフトウェアを作成しているのですが、
つくったDLLをLoadLibraryで読み込むとAccessViolationExceptionエラーが生じてしまいます。
DLLは作成されているのですが、なぜ使えないのでしょうか?
コードの間違いのご指摘をお願いします。
// Form1.h
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
String^toolname;
toolname=textBox1->Text;
String^savecpppath="ファイルへのパスがかいてあります";
//richTextBox1にコードを書きます。
richTextBox1->SaveFile(savecpppath+toolname+".cpp", RichTextBoxStreamType::PlainText );
//batファイルを作る もともと用意されたバッチファイルから読み込み書きます。
String^ fileName = "batfile.txt";
StreamReader^din=gcnew StreamReader(fileName,System::Text::Encoding::GetEncoding("shift-jis"));
int a=0;
int i=0;
String^ str;
int count = 0;
String^w;
while ((str = din->ReadLine()) != nullptr)
{
a=count;
count++;
marshal_context^c=gcnew marshal_context();
string s=c->marshal_as<string>(str);
battext[a]=s;
}
String^ outputName = "vccmd.bat";
StreamWriter^ sw = gcnew StreamWriter(outputName,false,System::Text::Encoding::GetEncoding("shift-jis"));
for (i=0;i<=2;i++){
w=marshal_as<String^>(battext[i]);
sw->WriteLine(w);
}
sw->WriteLine("cl /LD "+toolname+".cpp");
w=marshal_as<String^>(battext[3]);
sw->WriteLine(w);
sw->Close();
//batファイルを起動する。
Process^ batrun = gcnew Process;
batrun->Start("vccmd.bat");
//vccmd.batの内容
cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin
call vcvars32.bat
cd (DLLのあるパスが書かれている)
exit
//試験用のDLLプログラム これをrichtextBoxに入力します。
#define _One_MAKE_DLL_
#include "c11dll.h"
/*
外部に公開され共有される関数MyFunction
その機能は、与えられた整数を100で割った余りを返す。
*/
__PORT int MyFunction(int x)
{
return x%100;
}