VB5.0SP3で自作DLLの参照設定ができない
- VB5.0SP3で自作DLLの参照設定を行おうとすると、「指定されたファイルへの参照は登録できません」というエラーメッセージが表示されます。どうすれば参照設定ができるようになるのでしょうか?
- DLLはC言語で作成され、コンパイルはVC++6.0SP6で行われています。VCのコマンドでコンパイルしたDLLと、プロジェクトを作成してビルドしたDLLの両方で参照設定ができない状態です。
- 参照設定ができない問題の原因や解決策について教えてください。
- ベストアンサー
参照設定ができない
VB5.0SP3で自作DLLの参照設定を行おうとすると 次のようなメッセージが出て設定できません 「指定されたファイルへの参照は登録できません」 DLLはC言語で作っていてコンパイルはVC++6.0SP6で 行っています VCのコマンドでコンパイルして作ったDLLとプロジェクトを作成してビルドして作ったDLLでもだめでした どうすれば参照設定が出来るようになるのでしょうか? ソースは次のようになっています a.defの内容: LIBRARY a EXPORTS int2byte a.cの内容: #include <stdio.h> #include <string.h> #include <windows.h> #define DLLEXPORT __declspec(dllexport) union { short s; char c[2]; } ib; DLLEXPORT int __stdcall int2byte(short a, char* b){ ib.s = a; b[0] = ib.c[0]; b[1] = ib.c[1]; return 0; } makefileの内容: CC = cl SHLD = cl /LD CFLAGS = /nologo /O2 /GR- /GX- LDFLAGS = /nologo LIBS = .c.obj: $(CC) $(CFLAGS) -c $*.c a.dll: a.obj $(SHLD) /o $@ $(LDFLAGS) a.obj a.def $(LIBS)
- spen
- お礼率66% (2/3)
- Visual Basic
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
VBで参照設定できるDLLは、ActiveXのみです。 spenさんが作られたDLLはActiveXではありませんので参照設定できません。 Declareステートメント記述して使用するDLLです。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
一応補足。 >VBで参照設定できるDLLは、ActiveXのみです。 正確に言うとActiveXじゃなくてもいいんですけど、タイプライブラリというのが必要になります。
関連するQ&A
- VB6から参照可能なDLLの作成
VB6から参照可能なDLLの作成を参考書をみながらしましたが、上手くいかない為質問させていただきます。 開発環境VC++ 2005 C++ CTEST.dll #include <windows.h> __declspec (dllexport) int __stdcall test(int i) { i = i + 5; return i; } .defファイル LIBRARY "test" DESCRIPTION EXPORTS A 以上でDLLを作成し、VB6側で Private Declare test Lib "CTEST.dll" (ByVal i as integer) で宣言しても「エラー53 ファイルがみつかりません」と表示されます。「参照の追加」から参照しようとしても「このファイルは参照できません。」をエラーがでてしまいます。 直すべき点はどの部分なのでしょうか? ご教示ねがいます。
- ベストアンサー
- C・C++・C#
- オブジェクトの参照を返す関数の扱い
オブジェクトの作成と関数との関係を勉強していますが参照の使い方に関して質問させていただきたいと思います。 以下のような簡単なプログラムを作りました。 myclass.cpp myclass.h で記述されたクラスmyclassは整数を一つ持ち、show_value関数でその整数を表示し、say_heyで"hey"という文字を出力するというものです。 このクラスを利用するプログラムとしてmain.cppをつくりました。このなかには2つの関数が使われます。 -オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj) -オブジェクトをつくりそれの参照を返す関数(return_ref_obj) これらの関数を用いてオブジェクトをつくり、そのオブジェクトを戻り値としてmainのなかでオブジェクトのshow_value関数で保持する整数を表示する、というものです。 myclass.h-------------------------------- class Myclass{ public: int my_int; Myclass(); ~Myclass(); void show_value(); void say_hey(); }; myclass.cpp---------------------------------- #include "myclass.h" #include <iostream> using namespace std; Myclass::Myclass(){}; Myclass::~Myclass(){}; void Myclass::show_value(){ printf("%d\n", my_int); } void Myclass::say_hey(){ printf("hey\n"); } main.cpp------------ #include <iostream> #include "myclass.h" using namespace std; //オブジェクトをつくりそれをオブジェクトとして返す関数(return_obj) Myclass return_obj(int int_in){ Myclass myobject; myobject.my_int = int_in; //引数をオブジェクトのmy_intに渡す return myobject; } //オブジェクトをつくりそれの参照を返す関数(return_ref_obj) Myclass& return_ref_obj(int int_in2){ Myclass myobject; myobject.my_int = int_in2; //引数をオブジェクトのmy_intに渡す Myclass& ref_of_myclass = myobject; return ref_of_myclass; } void main(){ Myclass returned_obj = return_obj(1); //関数に1を渡し、1を保持するオブジェクトを作成 returned_obj.show_value(); //整数(1)表示 returned_obj.say_hey(); Myclass& ref_obj = return_ref_obj(2); //関数に2を渡し、2を保持するオブジェクトを作成し参照として受け取る ref_obj.show_value(); //整数(2)表示 ref_obj.say_hey(); } プログラムを実行した出力------------------- 1 hey -858993460 hey このようにオブジェクト自体を返してコピーしたもの(return_obj使用)はshow_valueでただしくオブジェクトに保持された数が表示されますが 参照でオブジェクトを返したもの(return_ref_obj使用)はアドレスのような数列が表示されます。 質問A これはオブジェクトの参照を返す関数(return_ref_obj)でオブジェクトを作成しても、そのオブジェクトが関数の中でのみ実在しており、関数がおわるとその実体がなくなるためではないかと解釈しているのですがそれで正しいでしょうか? 質問B 関数でオブジェクトを作成してそれをプログラム本体に渡すときはreturn_objのようにオブジェクト自体をコピーしなければ参照などで渡すことはできないのでしょうか? クラスと参照自体勉強を始めたばかりで色々と初歩的な間違いもあるとは思いますが、よろしくお願いします
- ベストアンサー
- C・C++・C#
- 茶筅を使いたい!
茶筅を使って形態素解析を行いたいと思っています。 使う言語はC++です。 環境はborland C++ 5.5です。 サンプルプログラムを実行するのですが、 Error: 外部シンボル '_set_argument_parameters' が未解決(C:\PROGRAM FILES\CHASEN21\DLL\DLLTEST.OBJ が参照) Error: 外部シンボル '_analyze' が未解決(C:\PROGRAM FILES\CHASEN21\DLL\DLLTEST.OBJ が参照) というエラーがでます。 環境設定で、chadll.hのある場所まで設定しています。 (この辺の意味が全然わかりませんが) dllとかlibとかに疎いので、全然進めません。 どのようにすればうまく動かすことができますか?? サンプルプログラム #include <stdio.h> #include "chadll.h" int main(int argc,char** argv) { char input[10000] = "これは形態素解析のテストです。"; set_argument_parameters(argc,argv); printf( "%s", analyze( input ) ); return 0; }
- ベストアンサー
- C・C++・C#
- DLL作成時、defファイルを使いたくない
また質問させて下さい。 Visual Studio2005でDLLを使ったプログラムを作ろうとしています。 defファイルを利用すると、そのDLLファイルを作成できるのですが、 __declspec(dllexport)を利用すると、DLLファイルのその関数を読めなくなってしまいます。 なぜでしょうか? 下記は、MFCで、dll_test7というプロジェクトを作り、そのdll_test7.hのコードのすぐ下に その関数を書きました。(これがダメだと思うのですが…) //●Visual Studioのプロジェクト作成で、生成される部分 // dll_test7.h : dll_test7.DLL のメイン ヘッダー ファイル // #pragma once __declspec(dllexport) void __cdecl test0(void); #ifndef __AFXWIN_H__ #error "PCH に対してこのファイルをインクルードする前に 'stdafx.h' をインクルードしてください" #endif #include "resource.h" // メイン シンボル // Cdll_test7App // このクラスの実装に関しては dll_test7.cpp を参照してください。 // class Cdll_test7App : public CWinApp { public: Cdll_test7App(); // オーバーライド public: virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP() }; //■作成した関数 __declspec(dllexport) void __cdecl test0(void) { CString cs; cs="aa"; ::AfxMessageBox(cs); } 上記は、defファイルを利用するとこの関数を呼び出せます。 以上、どうぞよろしくお願い致します。
- ベストアンサー
- C・C++・C#
- C#からDLLの呼び出し方
visual studio 2008 express edition C#3.5 を使用しています。 http://www.hata.cc/docs/wlinee/1.html を参考にC++からではMySub関数を呼び出すことができたのですが、 C#から呼び出そうと次のように記述したのですが、 [System.Runtime.InteropServices.DllImport("a.dll")] extern int WINAPI MySub(int a, int b); 書き終わったときに、MySubの下に赤線がでて「;が必要です」 というエラーが出てしまいます・・・ たぶん「WINAPI」が認識されてないと思うのですが、 どのように記述すればよいのでしょうか? ~C++での記述~ [dllcall.cpp] #include "stdafx.h" #include <windows.h> #include <conio.h> // getch( ) を使用するのに必要 extern int WINAPI MySub(int a, int b); int _tmain(int argc, _TCHAR* argv[]) { int c; c=MySub(9, 3); printf("ans=%d\n",c); getch();// キーが押されるまで待つ return 0; } [a.cpp] __declspec(dllexport)int WINAPI MySub(int a, int b) { return a-b; }
- ベストアンサー
- その他(プログラミング・開発)
- ilink32について。'__setargv__'と'__turboFloat__'が未解決
WindowsXP+bcc32+ilink32でGLUTを使ったプログラムを書いています。 bccの設定はsetbcc.exe(http://www.cmagazine.jp/setbcc.html)を使いました。 opengl32.lib, glu32.lib, glut32.libはimplib.exe(http://blog.jyoken.net/?eid=478291)を使って作成しました。 以上の設定でbcc32付属のMakeを使ってmakeしたところ、 コンパイル後のリンクで以下のようなエラーが出てしまい困っています。 どなたか解決法を教えていただけないでしょうか? よろしくお願いします。 --------------------- エラーの内容 --------------------- Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '__setargv__' が未解決(root が参照) Error: 外部シンボル '__turboFloat' が未解決(root が参照) --------------------- --------------------- 使用しているMakefile --------------------- CC = bcc32 LINKER = ilink32 SRCS = main.c callback.c Task.c Logger.c OBJS = $(SRCS:.c=.obj) TARGET = main.exe CFLAGS = -wall -O2 LFLAGS = LIBS = opengl32.lib glu32.lib glut32.lib INCLUDE = -I"C:\borland\bcc55\Include" LIB = -L"C:\borland\bcc55\Lib" all: $(TARGET) .SUFFIXES : .obj .c .c.obj: $(CC) $(CFLAGS) -c $(SRCS) $(TARGET): $(OBJS) $(LINKER) $(LFLAGS) $(LIB) $(OBJS),$(TARGET),,$(LIBS) ---------------------
- ベストアンサー
- C・C++・C#
- bcc32 GetProcAddress( )
mydll.cpp と mymain.cpp でDLL内の関数を使うテストを しようとしたところです。 GetProcAddress( ) が失敗します。 どこを直せばいいか教えてください。 ///////// mydll.cpp #include <windows.h> extern "C" __declspec(dllexport) int MyFunc(int, int); int MyFunc(int a, int b){return( a + b );} ///////// mymain.cpp #include <windows.h> typedef int (*FUNCTYPE)(int, int); LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ HMODULE hModule; FUNCTYPE ft; int i; switch(msg){ case WM_RBUTTONDOWN: hModule = LoadLibrary("mydll.dll"); ft = (FUNCTYPE)GetProcAddress(hModule, "MyFunc"); if(ft == NULL){ //GetLastError(); } i = (*ft)(7, 8); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int){ ・・・ } ///////// コンパイル C:\bcc32 -WD mydll C:\bcc32 -W mymain mydll.obj ///////// 実行 LoadLibrary( ) は NULL 以外を返しました。 DLL_PROCESS_ATTACH は確認できました。 GetProcAddress( ) は NULL を返しました。
- ベストアンサー
- C・C++・C#
- 参照による呼び出し
参照による呼び出しで3つの整数を大きい順に並び替えるという プログラムで、 #include<stdio.h> void change(int *x,int *y,int *z);/ main(){ int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("入力データ:a=%d,b=%d,c=%d\n",a,b,c); change(&a,&b,&c); printf("入れ替え後:a=%d,b=%d,c=%d\n",a,b,c); return(0); } void change(int *x,int *y,int *z){ if(*x>*y){ *a=*x; *c=*y; } else{ *a=*y; *c=*x; } if(*z>*a){ *b=*a; *a=*z; } else if(*z>*c){ *b=*z; } else{ *b=*c; *c=*z; } } のように作ったのですが、zの値が一度も使われていないとエラーが 出てしまいます。どこをどう直せばいいか教えてください。 お願いします。
- ベストアンサー
- C・C++・C#
- win版インテルコンパイラnmakeについて
linux版インテルコンパイラ(icc)を使っているmakefileをwindows版インテルコンパイラ(icl)で使えるように書きかえているのですが、コマンドプロンプトでどうもnmakeがうまくいきません。 元のmakefileは、 CC = icc CFLAGS = -O3 -xSSE4.2 CFLAGS2 = $(CFLAGS) -openmp -openmp-report1 LIBS = -lm -liomp5 PROGRAM = foo.exe SRCS = foo1.c foo2.c foo3.c .c.o: $(CC) $(CFLAGS) -c $< .SUFFIXES: .c .o all : $(PROGRAM) $(PROGRAM) : ${OBJS} $(CC) $(CFLAGS) -o $@ ${OBJS} $(LIBS) foo1.o : foo1.c foo.h foo2.o : foo2.c foo.h $(CC) $(CFLAGS2) -c $< foo3.o : foo3.c foo.h clean: rm *.o rm $(PROGRAM) で、書き換えたmakefileは、 CC = icl CFLAGS = -O3 -QxSSE4.2 CFLAGS2 = $(CFLAGS) -Qopenmp # CFLAGS = -W -O3 LIBS = -lm -liomp5 PROGRAM = foo.exe SRCS = foo1.c foo2.c foo3.c .c.o: $(CC) $(CFLAGS) -c $< .SUFFIXES: .c .o all : $(PROGRAM) $(PROGRAM) : ${OBJS} $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) foo1.o : foo1.c foo.h foo2.o : foo2.c foo.h $(CC) $(CFLAGS2) -c $< foo3.o : foo3.c foo.h clean: rm *.o rm $(PROGRAM) です。(投稿の際に見づらかったためスペースや改行はいじってます) CFLAGS2の-openmpを-Qopenmpにしたのと $(PROGRAM)の行の${OBJS}を$(OBJS)にしたぐらいですがエラーが発生します。({}括弧を使っているとエラーが発生したため) エラーメッセージは NMAKE : warning U4006: 特殊マクロは定義されていません : '$<' です。 {}の括弧を()に修正したのも似たエラーが発生したからなのですが、 コマンドプロンプトだと特殊マクロは使えないのでしょうか?
- ベストアンサー
- C・C++・C#
- CPLEX をCから使う方法について(環境設定)
自分の環境 Microsoft Visual Studio 2010 Version 10.0.30319.1 RTMRel Microsoft .NET Framework Version 4.0.30319 RTMRel インストールされているバージョン: VC Express http://www.fl.ctrl.titech.ac.jp/paper/2004/Thesis/B_taka.pdf#search='CPXopenCPLEX()' 上記のサイトを見ながらCPLEXをCから呼び出してLP問題を解きたいのですが最初の環境設定のところでつまずいてしまいました。 プロジェクト→プロパティ→構成プロパティ→C/C++→追加のインクルードディレクトリ C:\ILOG\CPLEX_Studio_AcademicResearch122\cplex\include\ilcplex←cplex.hのある場所を指定 プロジェクト→プロパティ→構成プロパティ→リンカ→追加の依存ファイル→cplex122.libを指定 自分で一応このような設定はしました、しかしpathの指定の方法などがわかりません。 下記のように骨組みだけ組んでみたのですがエラーが起きてしまいます。 #include <cplex.h> #include <stdlib.h> #include <string.h> #include <stdio.h> int main () { CPXENVptr env=NULL; int status=0; env = CPXopenCPLEX(&status); } エラー 2 error LNK2028: 未解決のトークン (0A00001E) "extern "C" struct cpxenv * __stdcall CPXopenCPLEX(int *)" (?CPXopenCPLEX@@$$J14YGPAUcpxenv@@PAH@Z) が関数 "int __cdecl main(void)" (?main@@$$HYAHXZ) で参照されました。 c:\Users\msysstu16-1\documents\visual studio 2010\Projects\cplexcc\cplexcc\cplexc.obj エラー 3 error LNK2019: 未解決の外部シンボル "extern "C" struct cpxenv * __stdcall CPXopenCPLEX(int *)" (?CPXopenCPLEX@@$$J14YGPAUcpxenv@@PAH@Z) が関数 "int __cdecl main(void)" (?main@@$$HYAHXZ) で参照されました。 c:\Users\msysstu16-1\documents\visual studio 2010\Projects\cplexcc\cplexcc\cplexc.obj エラー 4 error LNK1120: 外部参照 2 が未解決です。 c:\users\msysstu16-1\documents\visual studio 2010\Projects\cplexcc\Debug\cplexcc.exe 1 今現在どのような問題が考えられるのか、また、どのような調査を行うべきか、ご教示頂きたいです。 よろしくお願い致します。
- 締切済み
- C・C++・C#
お礼
ご回答ありがとうございます。 おかげさまで何とかなりそうです。 私がネットで調べた範囲には「ActiveXのみ」と書いている所が無かったので、ご回答の内容が直ぐには分からりませんでした。 試しに参照設定せずに動かしてみた所、私がCで作った関数の呼び出しをエラーも無く通過しました。それでやっと分かりました。 まだちゃんとデータの受け渡しが上手く出来ているか不明ですが、何とかなりそうです。 ありがとうございました