VC++(CLR)で作成したDLLがMagicから認識されない
Quantum
投稿数: 3
いつもお世話になっております。
C++/CLRで作成したDLLをuniPaaS V1からCallDLLまたはコールUDPでコールしようとしております。
当初、開発版では問題なく呼べていたのですが、実行環境で実行すると「ユーザモジュールが見つかりません」と出てしまいます。
解決策をご教示いただければと思います。
詳細は以下の通りです。
・市販のSpreadsheetGearを利用するためのDLLを作成する。SpreadsheetGearはマネージコードでのみ動作するのでCLRでDLLを作成した。
・uniPaaS V1のバッチタスクから当初CallDLLでコールしていた。
・C++ではクラスメソッドではなく関数として実装している。
・自分の開発環境の開発版から実行するとuniPaaSからDLLを呼べている。
・自分の開発環境の実行版(Client V1\uniRTE.exe)から実行してもuniPaaSからDLLを呼べている。
・他のマシンの開発版から実行するとuniPaaSからDLLを呼べている。
・開発版をインストールしていないマシンの実行版から実行すると「ユーザモジュールが見つかりません」と出る。
・なお、SpreadsheetGearを使用しない関数でも同じメッセージが出る。
以下、参考のためソースを載せます。整数値を返す関数になります。(なのでSpreadsheetGearは使っていません)
<Test.h>
#pragma once
using namespace System;
namespace Test {
public ref class Class1
{
// TODO: このクラスの、ユーザーのメソッドをここに追加してください。
};
}
<Test.cpp>
// これは メイン DLL ファイルです。
#include "stdafx.h"
#include <windows.h>
#include "Test.h"
#include "userdll.h"
// Magicからコールしたい関数
long retnum()
{
return 111;
}
#define FUNC_CNT 1
/*-------------------------------------------------------------------------*/
static FUNC_DSC fdsc_tbl[FUNC_CNT] =
{
{ (Uchar *) "retnum", (void far *)retnum, 0, (Uchar *) "L" }
};
static EXT_MODULE ext_module =
{ 0, NULL_PTR, NULL_PTR, FUNC_CNT, fdsc_tbl, (Uchar *) "Test" };
void *MAGIC_BIND(void)
{
return (&ext_module);
}
<Test.def>
LIBRARY Test
EXPORTS
MAGIC_BIND
retnum
<userdll.h>
uniPaaSのインストールフォルダにあるものそのまま
以下試してみたことを記します。
・開発時はuserdll.hやMAGIC_BIND等を含めていなかったが、開発版では動いていた。
・CallDLLをCallDLLSやCallDLLFに置き換えても実行環境ではダメ。
・CallDLLをコールUDPに変えても、実行環境ではダメ。
・Visual Studioから生成されたDLL以外のファイルも、実行環境のV1 Plusフォルダの下に置いたがダメ。
過去スレも見ましたが、uniPaaS V1Plusのバッチタスクからは.NETのDLLは呼べないとあるのを見ましたが、それだと何故開発環境では動くのだろうかという疑問がわきます。
COMオブジェクトとして作れば可というのも見ましたが、それも実際やってみても動かずにおります。こちらはもう少しがんばってみます。
以上、長文となりましたが、何卒よろしくお願いいたします。
C++/CLRで作成したDLLをuniPaaS V1からCallDLLまたはコールUDPでコールしようとしております。
当初、開発版では問題なく呼べていたのですが、実行環境で実行すると「ユーザモジュールが見つかりません」と出てしまいます。
解決策をご教示いただければと思います。
詳細は以下の通りです。
・市販のSpreadsheetGearを利用するためのDLLを作成する。SpreadsheetGearはマネージコードでのみ動作するのでCLRでDLLを作成した。
・uniPaaS V1のバッチタスクから当初CallDLLでコールしていた。
・C++ではクラスメソッドではなく関数として実装している。
・自分の開発環境の開発版から実行するとuniPaaSからDLLを呼べている。
・自分の開発環境の実行版(Client V1\uniRTE.exe)から実行してもuniPaaSからDLLを呼べている。
・他のマシンの開発版から実行するとuniPaaSからDLLを呼べている。
・開発版をインストールしていないマシンの実行版から実行すると「ユーザモジュールが見つかりません」と出る。
・なお、SpreadsheetGearを使用しない関数でも同じメッセージが出る。
以下、参考のためソースを載せます。整数値を返す関数になります。(なのでSpreadsheetGearは使っていません)
<Test.h>
#pragma once
using namespace System;
namespace Test {
public ref class Class1
{
// TODO: このクラスの、ユーザーのメソッドをここに追加してください。
};
}
<Test.cpp>
// これは メイン DLL ファイルです。
#include "stdafx.h"
#include <windows.h>
#include "Test.h"
#include "userdll.h"
// Magicからコールしたい関数
long retnum()
{
return 111;
}
#define FUNC_CNT 1
/*-------------------------------------------------------------------------*/
static FUNC_DSC fdsc_tbl[FUNC_CNT] =
{
{ (Uchar *) "retnum", (void far *)retnum, 0, (Uchar *) "L" }
};
static EXT_MODULE ext_module =
{ 0, NULL_PTR, NULL_PTR, FUNC_CNT, fdsc_tbl, (Uchar *) "Test" };
void *MAGIC_BIND(void)
{
return (&ext_module);
}
<Test.def>
LIBRARY Test
EXPORTS
MAGIC_BIND
retnum
<userdll.h>
uniPaaSのインストールフォルダにあるものそのまま
以下試してみたことを記します。
・開発時はuserdll.hやMAGIC_BIND等を含めていなかったが、開発版では動いていた。
・CallDLLをCallDLLSやCallDLLFに置き換えても実行環境ではダメ。
・CallDLLをコールUDPに変えても、実行環境ではダメ。
・Visual Studioから生成されたDLL以外のファイルも、実行環境のV1 Plusフォルダの下に置いたがダメ。
過去スレも見ましたが、uniPaaS V1Plusのバッチタスクからは.NETのDLLは呼べないとあるのを見ましたが、それだと何故開発環境では動くのだろうかという疑問がわきます。
COMオブジェクトとして作れば可というのも見ましたが、それも実際やってみても動かずにおります。こちらはもう少しがんばってみます。
以上、長文となりましたが、何卒よろしくお願いいたします。
投票数:0
平均点:0.00
投稿ツリー
-
VC++(CLR)で作成したDLLがMagicから認識されない
(Quantum, 2016-5-19 16:17)
- Re: VC++(CLR)で作成したDLLがMagicから認識されない (ISHIJIMA, 2016-5-19 16:25)
- Re: VC++(CLR)で作成したDLLがMagicから認識されない (null, 2016-5-22 18:47)
-
Re: VC++(CLR)で作成したDLLがMagicから認識されない
(Quantum, 2016-5-23 14:47)
- Re: VC++(CLR)で作成したDLLがMagicから認識されない (null, 2016-5-23 17:46)
- Re: VC++(CLR)で作成したDLLがMagicから認識されない (Quantum, 2016-5-25 10:44)